計算機プログラムの構造と解釈 第二版 P58 問題2.19
目的は
・手続きfirst-denominationを定義する
・手続きexcept-first-denominationを定義する
・手続きno-more?を定義する
・リストcoin-valuesの順はccの答えに影響があるか?なぜか?語る
あんまり難しく考えないほうがいい。
no-more?
はどう考えても、リストが空か否か調べる幹事だし、
first-denomination
は、「初めの貨幣」ってなって
except-first-denomination
は、「それ以外の貨幣」
だので、まあ予想はつくよね。
で、求める四番目のリストの順番は関係ない。
関係あると思ったけど、試してみたら順番関係なかった。
まー、よくよく考えたらそりゃそうかなと思った。
実装
#!/usr/local/bin/gosh ;; -*- coding: utf-8 -*- (use ggc.debug.trace) (use math.mt-random) (define us-coins (list 50 25 10 5 1)) (define us-coins2 (list 1 5 10 25 50)) (define uk-coins (list 100 50 20 10 5 2 1 0.5)) (define (cc amount coin-values) (cond ((= amount 0) 1) ((or (< amount 0) (no-more? coin-values)) 0) (else (+ (cc amount (exept-first-denomination coin-values)) (cc (- amount (first-denomination coin-values)) coin-values))))) (define (no-more? items) (null? items)) (define (first-denomination items) (car items)) (define (exept-first-denomination items) (cdr items)) ;; main (define (main args) (display "(cc 100 us-coins): ") (display (cc 100 us-coins)) (newline) (display "(cc 100 us-coins2): ") (display (cc 100 us-coins2)) (newline) (display "(cc 100 uk-coins): ") (display (cc 100 uk-coins)) (newline) 0)
実行
(cc 100 us-coins): 292 (cc 100 us-coins2): 292 (cc 100 uk-coins): 104561
OK