SICPを読む(12) 問題1.11 - 1.15 やっぱり反復が・・・。
やっぱり、ひげぽんと同じように反復が解けなかった・・・。
問題1.11
フィボナッチ強力版の登場です。ボスクラス。
n < 3の時、 f(n) = n
n >= 3の時、f(n) = f(n - 1) + 2f(n - 2) + 3f(n - 3)
となる関数を再帰と反復で計算する手続きを書け。
再帰は一瞬で解けた。
; 再帰 (define (f n) (if (< n 3) n (+ (f (- n 1)) (* (f (- n 2)) 2) (* (f (- n 3)) 3))))
反復は終端の処理が判らず、答えを見た。
; 反復 (define (f n) (define (iter a b c count) (cond ((= count 0) c) ((= count 1) b) (else (iter (+ a (* b 2) (* c 3)) a b (- count 1))))) (iter 2 1 0 n))
答えを見てもすぐにアルゴリズムが見出せなかったが、仕事中に謎が解けた(笑
反復のポイントは、
- ずらし。
- a b c を (iter (+ ...) a bとして、cを捨てる。
- 先読みしている。
- count - 2 の時にはcount - 4まで先読み。
悩んだので、何も見ずに解けるようになった。
問題1.12
パスカルの三角形の要素を計算せよ。
公式があるようですが、公式を使わずに解きます。
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1
と、三角形を崩して、左上方向と、上方向に走査していこうと思います。
(define (pascal row col) (if (or (= col 0) (= row col)) 1 (+ (pascal (- row 1) col) (pascal (- row 1) (- col 1))))) (pascal 4 0) ; 1 (pascal 4 1) ; 4 (pascal 4 2) ; 6 (pascal 4 3) ; 4 (pascal 4 4) ; 1
おぉぉぉぉ。
自分で再帰的パターンを見出すことが出来ました!!
感動。
問題1.14
- 紙に書いたが・・・ゼロを忘れてた。
- スペースとステップ数の関係がイマイチ掴めてない。
問題1.15
- 計算するのが面倒だったので、dispalyデバッグを使って確認。大体予想どおり。
- スペースとステップ数の関係がイマイチ掴めてない。
まとめ
- 「考える」というプロセスがやけに楽しい。
- 数学おもろい。
- 括弧に慣れてきた。
- Schemeはシンプルだ。
- スペースとステップ数計算の理解度が全然足りない。
更新履歴
- 2013/05/23
- 1.12を少し修正。