【SICP练习】67 练习2.38

本文深入探讨了fold-left和fold-right在SICP练习2.38中的应用,通过对比积累函数(accumulate)和迭代过程,解析了两种操作如何在序列上产生不同结果,并讨论了使它们产生相同结果所需的条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



练习2.38

这道题比较有意思了,我们先来将fold-left和accumulate类比,accumulate是递归,而fold-left是迭代。前者通过不断地将(op result (car rest)变换成initial,通过将(cdr rest)变换成sequence,而rest一开始其实就是sequence,result一开始则是initial。

result——(op result (car rest))

rest——(cdr rest)

因此我们将(fold-left / 1 (list 1 2 3))展开如下:

(iter 1 ‘(1 2 3))

(iter (/ 1 1) ‘(2 3))

(iter (/ (/ 1 1) 2) ‘(3))

(iter (/ (/ (/ 1 1) 2) 3) ‘())

(/ (/ (/ 1 1) 2) 3)

(/ (/ 1 2) 3)

(/ 1/2 3)

1/6

既然书上说了accumulate又称为fold-right,也就是accumulate的定义同样适用于fold-right了。而它就更加简单了:(/ 1 (/ 2 (/ 3 1) ) ),也就是3/2。

将其中的值代换一下得到:(list 1 (list 2 (list 3 ‘() ) ) ),也就是(1 (2(3 () ) ) ),这就是第三小题的结果了。

而第四小题将第二小题的过程代换一下就是如此:(list (list (list ‘() 1) 2) 3),也就是( ( ( ‘()1) 2) 3)。

如果要让fold-left和fold-right对任何序列产生相同的结果,那么就需要传说中的结合律了。不管从左边操作过去,还是从右边操作过来,都是一样的结果。最简单的就是加法了,而且and、or一类的函数也可以达到相同的效果。

版权声明:本文为 NoMasp柯于旺 原创文章,未经许可严禁转载!欢迎访问我的博客:http://blog.youkuaiyun.com/nomasp

转载于:https://my.oschina.net/nomasp/blog/503229

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值