【SICP练习】67 练习2.38
来源:互联网 发布:守望先锋英雄数据 编辑:程序博客网 时间:2024/05/16 01:59
练习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一类的函数也可以达到相同的效果。 5 0
- 【SICP练习】67 练习2.38
- 【SICP练习】2 练习1.6
- 【SICP练习】3 练习1.7
- 【SICP练习】4 练习1.8
- 【SICP练习】5 练习1.9
- 【SICP练习】6 练习1.10
- 【SICP练习】7 练习1.11
- 【SICP练习】8 练习1.12
- 【SICP练习】9 练习1.15
- 【SICP练习】10 练习1.16
- 【SICP练习】11 练习1.17
- 【SICP练习】12 练习1.18
- 【SICP练习】13 练习1.19
- 【SICP练习】14 练习1.20
- 【SICP练习】15 练习1.21
- 【SICP练习】16 练习1.22
- 【SICP练习】17 练习1.23
- 【SICP练习】18 练习1.24
- 动态规划学习系列——划分DP(三)
- 【线性回归】为何线性回归误差要服从高斯分布?
- 【SICP练习】64 练习2.35
- 【SICP练习】65 练习2.36
- 【SICP练习】66 练习2.37
- 【SICP练习】67 练习2.38
- 【SICP练习】68 练习2.39
- rails中select不能响应多选的解决办法
- 【SICP练习】69 练习2.40
- 【SICP练习】70 练习2.41
- fhq Treap模板
- 【SICP练习】71 练习2.42
- 【SICP练习】72 练习2.43
- javaweb学习心得(每天写一点,写点自己学习时碰到的不会的东西)