【发布时间】:2019-08-18 11:06:44
【问题描述】:
我正在研究 SICP,并编写了两个程序来计算 1/n^2 的总和,第一个生成递归过程,第二个生成迭代过程:
(define (sum-rec a b)
(if (> a b)
0
(exact->inexact (+ (/ 1 (* a a)) (sum-rec (1+ a) b)))))
(define (sum-it a b)
(define (sum_iter a tot)
(if (> a b)
tot
(sum_iter (1+ a) (+ (/ 1 (* a a)) tot))))
(exact->inexact (sum_iter a 0)))
我测试了两个过程在使用较小的 b 值调用时给出完全相同的结果,并且结果接近 $pi^2/6$,因为 b 变大,正如预期的那样。
但令人惊讶的是,调用 (sum-rec 1 250000) 几乎是瞬时的,而调用 (sum-it 1 250000) 则需要很长时间。
对此有解释吗?
【问题讨论】:
-
两者不等价——
sum_iter使用精确算术;sum-rec没有。 -
这意味着使用bignums会有很多计算,很昂贵