示例:用流进行迭代

用无穷流演示牛顿迭代法求平方根和级数展开计算圆周率 π 的过程。

回到第 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 之间。