SICP 2.38 研究递归和迭代模型

本文探讨了Scheme语言中fold_right(右折叠)与fold_left(左折叠)的区别及其实现方式。通过具体实例展示了这两种折叠操作如何处理列表并产生不同的结果。

之前讨论的过程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)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值