练习 3.53

根据定义, s 的第一个值是 1 ,之后每个元素都是两个 s 的值之和,因此 s 产生的序列是 \(1, 2, 4, 8, 16, \ldots , 2^n\)

1 ]=> (load "53.scm")

;Loading "53.scm"...
;  Loading "p228-add-streams.scm"... done
;... done
;Value: s

1 ]=> (stream-head s 10)

;Value 11: (1 2 4 8 16 32 64 128 256 512)

测试代码中用到的 stream-head 可以取出流的前 k 个元素。

示例图

以图示的办法应该能更清晰地观察到 s 的发展形式。

以下是 s 的展开的第一步:

  1
 / \
s + s

展开第二步:

     1
    / \
  1  +  1
 / \   / \
s + s s + s

展开第三步:

           1
          / \
         /   \
        /     \
       /       \
      /         \
     1     +     1
    / \         / \
   /   \       /   \
  1  +  1  +  1  +  1
 / \   / \   / \   / \
s + s s + s s + s s + s

展开第四步:

                       1
                      / \
                     /   \
                    /     \
                   /       \
                  /         \
                 /           \
                /             \
               /               \
              /                 \
             /                   \
            /                     \
           1           +           1
          / \                     / \
         /   \                   /   \
        /     \                 /     \
       /       \               /       \
      /         \             /         \
     1     +     1           1     +     1
    / \         / \         / \         / \
   /   \       /   \       /   \       /   \
  1  +  1     1  +  1     1  +  1     1  +  1
 / \   / \   / \   / \   / \   / \   / \   / \
s + s s + s s + s s + s s + s s + s s + s s + s

讨论

blog comments powered by Disqus