示例:用流进行迭代
用无穷流演示牛顿迭代法求平方根和级数展开计算圆周率 π 的过程。
回到第 1 单元,我们写过一个求给定数——记作 x——的平方根近似值的过程。思路是反复应用改进猜测的过程,生成一系列越来越好的猜测值:
(define (sqrt-improve guess x)
(average guess (/ x guess)))
我们可以创建一条猜测的无穷流,初始猜测取 1:
(define (sqrt-stream x)
(define guesses
(cons-stream 1.0 (stream-map (lambda (guess)
(sqrt-improve guess x))
guesses)))
guesses)
(sqrt-stream 2) 的前几个元素是:
1
1.5
1.4166666666666665
1.4142156862745097
1.4142135623746899
流的每一个后继元素都越来越接近 2 的平方根。
同样,我们曾用下面的级数公式来逼近 π:
现在,用一条无穷流来计算 π:
(define (pi-summands n)
(cons-stream (/ 1.0 n)
(stream-map - (pi-summands (+ n 2)))))
(define pi-stream
(scale-stream (partial-sums (pi-summands 1)) 4))
前几个元素如下:
4.
2.666666666666667
3.466666666666667
2.8952380952380956
3.3396825396825403
2.9760461760461765
3.2837384837384844
3.017071817071818
可以看出,这些数在向 π 收敛——看过前八个元素后,我们可以知道 π 落在 3.28 和 3.02 之间。