您的位置:首页 > 其它

SICP 2.38 研究递归和迭代模型

2017-01-17 01:25 260 查看
之前讨论的过程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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  迭代 递归 scheme lisp sicp