SICP 読み (187) 4.2.2 遅延評価の解釈系
問題 4.29 のつづき
試験なソレで確認してみるに、類推は正しかった模様。良かった。で、_Exhibit a program that you would expect to run much more slowly without memoization than with memoization._なソレですが、ちょっと前に時間をかけて検討してみた map でもそれなりの効果がありそうな気がする。
テキストには p.16 の sqrt とか p.34 の accumlate 等の走り書きがありますが、ポイントとしては
- 同じ変数を何度か使い回している
- 再帰呼び出しの引数
というナニで memoize する効果がありそげ。
で、色々仕込んで map の動作を確認してみるに、入力なリストが 10000 件にな時点で処理にやたらに時間がかかる事が判明。終わるまで待っていられない。何かトンデモなボケをぶちカマしているに違いない。
で、色々考えるに
(define (reverse l) (define (reverse-iter l r) (if (null? l) r (reverse-iter (cdr l) (cons (car l) r)))) (reverse-iter l '()))
みたいなナニで、memoize な効果は十分なのかなあ。確認してみたいんですが時間ナシ。帰宅後はリカバリな作業がわしを待っている。とほほほ。
追記
名前 let の処理で SIGSEG する。ここはテキストでは触れられていない部分なんですが、解決にトライした方が良さげ。