SICP 习题 (1.30)解题总结
2014-03-16 00:59
176 查看
SICP 习题1.30看上去像是一条复习题,要求我们将一个线性递归过程改写成一个迭代过程。
需要改写的过程如下:
不过仔细看看题目就会发现,这道题和一般的递归该迭代的习题不同,这道题把过程term 和next当参数进行传递,其灵魂还是高阶函数。
当我们逐渐习惯把一个过程当做普通的数据进行处理,就会发现这些东西其实没有那么难。
按以前的递归转迭代的思路,主要是寻找中间的不变量。
这里我们就定义参数result记录每次累加的结果,每次都先完成计算,将计算结果累加到result中后再进行“递归调用”。
定义的迭代过程如下:
然后通过(iter a 0)来启动计算,最终结果如下:
需要改写的过程如下:
(define (sum term a next b) (if (> a b) 0 (+ (term a) (sum term (next a) next b))))
不过仔细看看题目就会发现,这道题和一般的递归该迭代的习题不同,这道题把过程term 和next当参数进行传递,其灵魂还是高阶函数。
当我们逐渐习惯把一个过程当做普通的数据进行处理,就会发现这些东西其实没有那么难。
按以前的递归转迭代的思路,主要是寻找中间的不变量。
这里我们就定义参数result记录每次累加的结果,每次都先完成计算,将计算结果累加到result中后再进行“递归调用”。
定义的迭代过程如下:
(define (iter a result) (if (> a b) result (iter (next a) (+ (term a) result))))
然后通过(iter a 0)来启动计算,最终结果如下:
(define (sum-iter term a next b )
(define (iter a result) (if (> a b) result (iter (next a) (+ (term a) result))))
(iter a 0))
相关文章推荐
- SICP 习题 (1.7) 解题总结
- SICP 习题 (2.6) 解题总结:丘奇计数
- SICP 习题 (1.32)解题总结
- SICP 习题 (1.33)解题总结
- SICP 习题 (2.28)解题总结:树状列表的遍历
- SICP 习题 (2.23)解题总结:for-each的实现
- SICP 习题 (2.31)解题总结 : 通用的Square-Tree
- SICP 习题 (1.38)解题总结
- SICP 习题 (1.46)解题总结:第一章的收官题
- SICP 习题 (2.1) 解题总结:用复合数据表示有理数
- SICP 习题 (2.7) 解题总结 : 定义区间数据结构
- SICP 习题 (2.13)解题总结:区间计算误差
- SICP 习题 (1.8) 解题总结
- SICP 习题 (2.29) 解题总结:二叉活动体
- SICP 习题 (1.37)解题总结
- SICP 习题 (1.39)解题总结
- SICP 习题 (2.3) 解题总结:用复合数据表示矩形
- SICP 习题 (1.14)解题总结
- SICP 习题 (1.16)解题总结
- SICP 习题 (1.35)解题总结