P02 (*) 获取列表的倒数第二个元素
2015-12-12 21:53
253 查看
Example:
(1)跟P01类似,只多判断一个条件,即如果列表里只有一个元素,则返回
(2)使用
(3)使用
等
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)))))))
相关文章推荐
- Ruby中使用Block、Proc、lambda实现闭包
- Ruby中的block、proc、lambda区别总结
- C++实现的一个可以写递归lambda的Y函数
- C#特性之匿名方法和Lambda表达式
- 理解C#中的Lambda表达式
- 初步认识C#中的Lambda表达式和匿名方法
- C#3.0中Lambda表达式详解
- C#基础之Lambda表达式用法实例教程
- 深入理解Java中的Lambda表达式
- Java8新特性之Lambda表达式浅析
- Java Lambda表达式详解和实例
- Java函数式编程(一):你好,Lambda表达式
- 用Python编写一个简单的Lisp解释器的教程
- python中lambda与def用法对比实例分析
- Python lambda和Python def区别分析
- Python中的特殊语法:filter、map、reduce、lambda介绍
- 跟老齐学Python之大话题小函数(1)
- python基础教程之lambda表达式使用方法
- Python的lambda匿名函数的简单介绍
- 深入解析Python中的lambda表达式的用法