問題1.14 で心が折れそうなので、とりあえず先に進むことにする
(define (count-change amount) (cc amount 5)) (define (cc amount kinds-of-coins) (cond ((= amount 0) 1) ((or (< amount 0) (= kinds-of-coins 0)) 0) (else (+ (cc amount (- kinds-of-coins 1)) (cc (- amount (first-denomination kinds-of-coins)) kinds-of-coins))))) (define (first-denomination kinds-of-coins) (cond ((= kinds-of-coins 1) 1) ((= kinds-of-coins 2) 5) ((= kinds-of-coins 3) 10) ((= kinds-of-coins 4) 25) ((= kinds-of-coins 5) 50)))
とりあえず置き換えてみる。
(count-change 11) (cc 11 5) (+ (cc 11 (- 5 1)) (cc (- 11 (first-denominations 5)) 5)) (+ (cc 11 (- 5 1)) (cc (- 11 50) 5)) (+ (cc 11 4) (cc -39 5)) (+ (+ (cc 11 (- 4 1)) (cc (- 11 (first-denomination 4)) 4)) 0) (+ (+ (cc 11 (- 4 1)) (cc (- 11 25) 4)) 0) (+ (+ (cc 11 3) (cc -14 4)) 0) (+ (+ (+ (cc 11 (- 3 1)) (cc (- 11 (first-denominations 3)) 3)) 0) 0) (+ (+ (+ (cc 11 (- 3 1)) (cc (- 11 10) 3)) 0) 0) (+ (+ (+ (cc 11 2) (cc 1 3)) 0) 0) (+ (+ (+ (+ (cc 11 (- 2 1)) (cc (- 11 (first-denominations 2)) 2)) ((+ (cc 1 (- 3 1)) (cc (- 1 (first-denominations 3)) 3)))) 0) 0) (+ (+ (+ (+ (cc 11 (- 2 1)) (cc (- 11 5) 2)) ((+ (cc 1 (- 3 1)) (cc (- 1 10) 3)))) 0) 0) (+ (+ (+ (+ (cc 11 1) (cc 6 2)) (+ (cc 1 2) (cc -9 3))) 0) 0) (+ (+ (+ (+ (+ (cc 11 (- 1 1)) (cc (- 11 (first-denominations 1)) 1)) (+ (cc 6 (- 2 1)) (cc (- 6 (first-denominations 2)) 2))) (+ (+ (cc 1 (- 2 1)) (cc (- 1 (first-denominations 2)) 2)) 0)) 0) 0) (+ (+ (+ (+ (+ (cc 11 (- 1 1)) (cc (- 11 1) 1)) (+ (cc 6 (- 2 1)) (cc (- 6 5) 2))) (+ (+ (cc 1 (- 2 1)) (cc (- 1 5) 2)) 0)) 0) 0) (+ (+ (+ (+ (+ (cc 11 0) (cc 10 1)) (+ (cc 6 1) (cc 1 2))) (+ (+ (cc 1 1) (cc -4 2)) 0)) 0) 0) (+ (+ (+ (+ (+ (cc 11 0) (cc 10 1)) (+ (cc 6 1) (cc 1 2))) (+ (+ (cc 1 1) 0) 0)) 0) 0) (+ (+ (+ (+ (+ 0 (+ (cc 10 (- 1 1)) (cc (- 10 (first-denomination 4)) 1)) (+ (+ (cc 6 (- 1 1)) (cc (- 6 (first-denomination 1)) 1)) (+ (cc 1 (- 2 1)) (cc (- 1 (first-denomination 2)) 2)) (+ (+ (+ (cc 1 (- 1 1)) (cc (- 1 (first-denomination 1) 1))) 0) 0)) 0) 0)))) (+ (+ (+ (+ (+ 0 (+ (cc 10 0) (cc (- 10 25) 1)) (+ (+ (cc 6 (- 1 1)) (cc (- 6 1) 1)) (+ (cc 1 (- 2 1)) (cc (- 1 5) 2)) (+ (+ (+ (cc 1 (- 1 1)) (cc (- 1 1) 1))) 0) 0)) 0) 0))) (+ (+ (+ (+ (+ 0 (+ 0 (cc -15 1)) (+ (+ (cc 6 0) (cc 5 1)) (+ (cc 1 1) (cc -4 2)) (+ (+ (+ (cc 1 0) (cc 0 1))) 0) 0)) 0) 0))) (+ (+ (+ (+ (+ (+ (+ 0 (cc 5 1)) (+ (cc 1 1) 0) (+ (+ (+ 0 0) 0) 0) 0) 0))))) (+ (+ (+ (+ (+ (+ (+ 0 (cc 5 1)) (+ (cc 1 1) 0) (+ (+ (+ 0 0) 0) 0) 0) 0))))) : :
よくわからなくなってしまった。。。orz
そもそも問題はなんだっけ?
「プロセスを表す木構造をかけ」だったな。
ちょっと木構造を書いてみよう
(11 5)
(11 4) (-39 5)
(???)
こ、これは、、、最初の置き換え自体ミスってる。涙
心が折れそうなので、とりあえずこのあたりにして
もう少し先に進んでみよう。
-
- -
あとで戻ってきたとき用の資料
解答例を探してみる。わかりやすい。
http://d.hatena.ne.jp/tmurata/20090402/1238629863
こんなのも見つけた
http://www.billthelizard.com/2009/12/sicp-exercise-114-counting-change.html