SICP 习题1.30看上去像是一条复习题,要求我们将一个线性递归过程改写成一个迭代过程。
需要改写的过程如下:
(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.30)解题总结,布布扣,bubuko.com
原文:http://blog.csdn.net/keyboardota/article/details/19261089