(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
そもそも問題はなんだっけ?

「プロセスを表す木構造をかけ」だったな。
ちょっと木構造を書いてみよう

1
2
<blockquote>
    <p>(11 5)<br />

(11 4) (-39 5)
(???)

1
</blockquote>

こ、これは、、、最初の置き換え自体ミスってる。涙
心が折れそうなので、とりあえずこのあたりにして
もう少し先に進んでみよう。

    • -

あとで戻ってきたとき用の資料


解答例を探してみる。わかりやすい。
http://d.hatena.ne.jp/tmurata/20090402/1238629863


こんなのも見つけた
http://www.billthelizard.com/2009/12/sicp-exercise-114-counting-change.html