本文
反復アルゴリズムに慣れるために両替が例に上がっている。ただ、ここで書かれている日本語がよくわからない(汗。
しかたないので原文もあわせて読みつつ何を言っているのか解釈(実際には不安に思ったところに曖昧さはなかった)。
註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)))))
ループだとカウントアップしていくのに、反復だとカウントダウンしていく感覚が何だかなじめない。
ただ、確かに数学的にはこっちの方がそれっぽい気はする。
頭の中に値が変化するモデルが組み立てられれば、反復の方が簡潔かつ柔軟に記述できそうな気はする。