您的位置:首页 > 其它

P02 (*) 获取列表的倒数第二个元素

2015-12-12 21:53 399 查看
Example:

sash> (last_but_one '(a b c d))
sash> c


(1)跟P01类似,只多判断一个条件,即如果列表里只有一个元素,则返回
#t


(define last_but_one
(lambda (ls)
(if (null? ls)
(raise 'not-found)
(let ([lr (cdr ls)])
(cond
[(null? lr) (raise 'not-found)]
[(null? (cdr lr)) (car ls)]
[else (last_but_one lr)])))))


(2)使用
reverse
函数

(define last_but_one
(lambda (ls)
(if (or (null? ls)
(null? (cdr ls)))
(raise 'not-found)
(cadr (reverse ls)))))


(3)使用
list-ref
函数

(define last_but_one
(lambda (ls)
(let ([len (length ls)])
(if (< len 2)
(raise 'not-found)
(list-ref ls (- len 2))))))




———-更新2015-12-15———–

P01 (*) 获取列表最后一个元素【重补】 最后的分析方法可得到:(1)方法也存在类似的逻辑冗余,修改如下:

(define last_but_one
(lambda (ls)
(if (or (null? ls)
(null? (cdr ls)))
(raise 'not-found)
(let loop ([h ls] [t (cddr ls)])
(if (null? t)
(car h)
(loop (cdr h) (cdr t)))))))


—-2015/12/23更新—-

最近喜欢上另一种风格:

(define last_but_one
(lambda (ls)
(if (or (null? ls)
(null? (cdr ls)))
(raise 'not-found)
(let loop ([h (car ls)]
[s (cadr ls)]
[t (cddr ls)])
(if (null? t)
h
(loop s
(car t)
(cdr t)))))))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lambda lisp scheme