SICP 読み (134) 3.5.2 無限ストリーム

相変わらず頭痛が酷い。このストレスフルな環境は何とかならんのか。

問題 3.57

ボケる可能性が高いですが構わず書きます。どうやって確認すれば良いんだろうか。とりあえず n 番目の Fibonacci 数を計算する時に add-streams は n - 2 回呼び出される、と思う。あと、memo-proc なソレを使わない場合、どうなるか、というと

回数 0 0 1 2 4 7 12 20 33 54

fibs 0 1 1 2 3 5  8 13 21 34

みたいなカンジになる、と見てるんですがダウト??
途中で Fibonacci なソレを追い越してるんで指数的に大きくなってる、という事で。

ってか、これが本当なのか、というナニを確認するにはどうすれば、という部分は別途検討してみたいと思います。現実トウヒには抜群に良さげ (を

問題 3.58

(expand 1 7 10) は以下と予想。

(1 4 2 8 5 7 1 4 2 8 5 7 ...)

(expand 3 8 10) は以下。

(3 7 5 0 0 0 ...)

アマいか。とりあえずこれは試験で確認するのは簡単だな。試験を以下に。

#!/usr/bin/env gosh

(use test.unit)
(require "3.5.1")

(define-test-suite "3.5.1"

  ("3.58"
   ("(expand 1 7 10)"
    (let ((s (expand 1 7 10)))
      (assert-equal 1 (stream-ref s 0))
      (assert-equal 4 (stream-ref s 1))
      (assert-equal 2 (stream-ref s 2))
      (assert-equal 8 (stream-ref s 3))
      (assert-equal 5 (stream-ref s 4))
      (assert-equal 7 (stream-ref s 5))
      (assert-equal 1 (stream-ref s 6))
      (assert-equal 4 (stream-ref s 7))
      )
    )

   ("(expand 3 8 10)"
    (let ((s (expand 3 8 10)))
      (assert-equal 3 (stream-ref s 0))
      (assert-equal 7 (stream-ref s 1))
      (assert-equal 5 (stream-ref s 2))
      (assert-equal 0 (stream-ref s 3))
      (assert-equal 0 (stream-ref s 4))
      )
    )
   )
  )

以降の問題は算数なソレがナニでハードルがわし的に高いです。