P05 (*) 反向列表中元素
2015-12-17 22:17
288 查看
如,反向之前
反向之后变为
R7RS的
不管有无副作用,实现的思路是一样的。给出实现:
(1)“Pure“版本
(2)“Mutation“版本
唯一的区别是:(1)用
图示如下,实线是反向前原有列表元素连接关系,虚线是反向后元素连接关系。注意:
pure版本
mutation版本
'(1 2 3),
反向之后变为
'(3 2 1)
R7RS的
(scheme base)提供了
reverse,没有副作用,纯的函数式版本。
(srfi 1)提供了mutation版本
reverse!,会改变原有列表的结果,有副作用。
不管有无副作用,实现的思路是一样的。给出实现:
(1)“Pure“版本my-reverse
(define my-reverse (lambda (ls) (let f ([ls ls] [new '()]) (if (null? ls) new (f (cdr ls) (cons (car ls) new))))))
(2)“Mutation“版本my-reverse!
(define my-reverse! (lambda (ls) (let f ([ls ls] [new '()]) (if (null? ls) new (let ([t (cdr ls)]) (set-cdr! ls new) (f t ls))))))
唯一的区别是:(1)用
cons建立新列表,而(2)使用
set-cdr!改变列表元素间的连接关系。
图示如下,实线是反向前原有列表元素连接关系,虚线是反向后元素连接关系。注意:
(eq? '() '())为
#t,
'()是唯一的,所以所有列表结尾都指向同一个
'()。
pure版本
mutation版本
——-2015/12/20 更新——–
使用fold-left更简单
(import (srfi 1)) (define my-reverse (lambda (ls) (fold-left (lambda (a e) (cons e a)) '() ls)))
相关文章推荐
- Spark RDD API详解(一) Map和Reduce
- Ruby中使用Block、Proc、lambda实现闭包
- Ruby中的block、proc、lambda区别总结
- C++实现的一个可以写递归lambda的Y函数
- C#特性之匿名方法和Lambda表达式
- 理解C#中的Lambda表达式
- 初步认识C#中的Lambda表达式和匿名方法
- C#3.0中Lambda表达式详解
- C#基础之Lambda表达式用法实例教程
- javascript函数式编程实例分析
- 比较不错的函数式JavaScript编程指南教程
- JavaScript中reduce()方法的使用详解
- JavaScript 函数式编程实践(来自IBM)第1/3页
- 深入理解Java中的Lambda表达式
- Java8新特性之Lambda表达式浅析
- 5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
- Java Lambda表达式详解和实例
- Java函数式编程(一):你好,Lambda表达式
- 跟老齐学Python之大话题小函数(2)
- 用Python编写一个简单的Lisp解释器的教程