SICP 2.38 研究递归和迭代模型

来源:互联网 发布:优雅的淘宝收件人名字 编辑:程序博客网 时间:2024/06/06 17:02

之前讨论的过程accumulate也称作fold_right(右折叠),因为它将序列的第一个元素组合到右边所有元素的结果上。相对的,也有个fold_left(左折叠),将左边的结果加到右边的元素上。
fold_right的scheme代码:

> (define (fold_left op initial sequence)    (define (iter result rest)      (if (null? rest)          result          (iter (op result (car rest))                (cdr rest))))

这是一个迭代的过程。
那么,下面的表达式的值是什么?
(fold_right / 1 (list 1 2 3))
(fold_left / 1(list 1 2 3))
(fold_right list nil (list 1 2 3))
(fold_left list nil (list 1 2 3))
fold_right是个线性递归过程,即最后一步便是回归操作的第一步,则第一个表达式的值是 1/(2/3)
fold_left 是个迭代(尾递归)过程,则第二个表达式的值是 (1/2)/3
同理:
第三个表达式的值是 ((1 2 3))
第四个表达式的值是 (((() 1) 2) 3)

0 0
原创粉丝点击