【SICP练习】67 练习2.38
2015-09-08 00:00
218 查看
练习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.csdn.net/nomasp
练习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.csdn.net/nomasp
相关文章推荐
- 用环境模型来理解javascript中的闭包
- 对嵌套映射的理解
- SICP Exercise 1.13
- sicp习题答案和范例代码 - 第一章
- sicp习题答案和范例代码 - 第二章 2.1
- SICP第一章——构造过程抽象之程序设计的基本元素(1.1)笔记及习题解答
- SICP-《计算机程序的构造和解释》之习题分析与收获——练习1.30
- SICP-《计算机程序的构造和解释》之习题分析与收获——练习1.29
- 游走于数据与代码之间
- 换零钱问题迭代解法
- Structure and Interpretation of Computer Programs 读书笔记
- 应用序和正则序
- [SICP Notes] 1.1 The Elements of Programming
- 【Structure and interpretation of Computer Programs 】学习记录兼导言
- 第一章笔记整理
- SICP-练习2.34
- SICP-练习2.17
- 计算斐波纳契数,分析算法复杂度
- SICP-求幂
- SICP-换零钱方法的统计