之前讨论的过程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语言中fold_right(右折叠)与fold_left(左折叠)的区别及其实现方式。通过具体实例展示了这两种折叠操作如何处理列表并产生不同的结果。
433

被折叠的 条评论
为什么被折叠?



