本文
反復アルゴリズムに慣れるために両替が例に上がっている。ただ、ここで書かれている日本語がよくわからない(汗。
しかたないので原文もあわせて読みつつ何を言っているのか解釈(実際には不安に思ったところに曖昧さはなかった)。
註33の内容を試しにやってみる。両替を cc 、d を使用する硬貨とすると
(cc d 10)
(cc 1 10) + (cc 5 5)
(cc 1 9) + (cc 5 5) → (cc 1 n) は (cc 1 0) になり、条件より 1 に置きかわる
1 + (cc 5 5)
1 + (cc 1 5) + (cc 5 0) → (cc 1 5) は先の計算の途中にも出て、1 に置きかわる。また、(cc 5 0) は条件より 1
1 + 1+ 1 = 3
という感じ。硬貨の額面金額を取得するために配列が使えないと、それだけで問題が難しくなるような気がする。
問題解答
問題1.11
再帰は簡単。
(define (f n) (if (< n 3) n (+ (f (- n 1)) (f (- n 2)) (f (- n 3)))))
反復でやっぱりハマるものの、うっすらといつも使っているループとの対応が取れてきた気がする。
自分の解答は以下の通り。
(define (f n)
(define (f-iter i v0 v1 v2)
(cond ((< n 3) n)
((= i (- n 3)) (+ v0 v1 v2))
(else (f-iter (+ i 1) v1 v2 ))))
(f-iter 0 0 1 2))
。。。と思って回答を見たら全然違う(そもそも問題を間違えていた)
(define (fi n)
(f-iter 2 1 0 n))
(define (f-iter a b c n)
(cond ((= n 0) c)
((= n 1) b)
((= n 2) a)
(else (f-iter (+ a b b c c c) a b (- n 1)))))
ループだとカウントアップしていくのに、反復だとカウントダウンしていく感覚が何だかなじめない。
ただ、確かに数学的にはこっちの方がそれっぽい気はする。
頭の中に値が変化するモデルが組み立てられれば、反復の方が簡潔かつ柔軟に記述できそうな気はする。




