SICP問題3.63
元のsqrt-stream
(define (sqrt-stream x) (define guesses (cons-stream 1.0 (stream-map (lambda (guess) (sqrt-improve guess x)) guesses))) guesses)
Louis Reasonerによる局所変数guessesを使用しないsqrt-stream
(define (sqrt-stream x) (cons-stream 1.0 (stream-map (lambda (guess) (sqrt-improve guess x)) (sqrt-stream x))))
Alyssa P. Hacker は手続きのこの版は冗長な計算をするのでかなり非効率だと答えたが、どういうことか?
delayの実装がmemo-procの用意した最適化を使わず(lambda ()
guessesを使用していないsqrt-streamでは、毎回ストリームを最初から生成することになり非効率である。guessesを使用しているsqrt-streamでは計算結果を覚えているため、計算済の部分については再度計算することはないため、効率に差がでる。
delay実装がmemo-procを使用していない場合は計算結果を覚えていないため、guessesを使用していても再度計算され効率の差はでない。