2.19
; Consider the change-counting program of Section 1.2.2. It would be nice
; to be able to easily change the currency used by the program, so that
; we could compute the number of ways to change a British pound, for
; example. As the program is written, the knowledge of the currency is
; distributed partly into the procedure first-denomination and partly
; into the procedure count-change (which knows that there are five kinds
; of U.S. coins). It would be nicer to be able to supply a list of coins
; to be used for making change.
; We want to rewrite the procedure cc so that its second argument is a
; list of the values of the coins to use rather than an integer specifying
; which coins to use. We could then have lists that defined each kind of
; currency:
(define us-coins (list 50 25 10 5 1))
(define uk-coins (list 100 50 20 10 5 2 1 0.5))
; We could then call cc as follows:
; (cc 100 us-coins)
; 292
; To do this will require changing the program cc somewhat. It will still
; have the same form, but it will access its second argument differently,
; as follows:
(define (cc amount coin-values)
(cond ((= amount 0) 1)
((or (< amount 0) (no-more? coin-values)) 0)
(else
(+ (cc amount
(except-first-denomination coin-values))
(cc (- amount
(first-denomination coin-values))
coin-values)))))
; Define the procedures `first-denomination`, `except-first-denomination`,
; and `no-more`? in terms of primitive operations on list structures. Does
; the order of the list `coin-values` affect the answer produced by cc?
; Why or why not?
; Answer
; -----------------------------------------------------------
; Define `no-more?`, `except-first-denomination` and `first-denomination`
(define (no-more? items) (null? items))
(define (except-first-denomination items) (cdr items))
(define (first-denomination items) (car items))
; Testing
(cc 100 us-coins) ;Value: 292
(cc 100 uk-coins) ;Value: 104561 (TAKES TIME TO COMPUTE)
; Test the order
(cc 100 (list 25 50 10 5 1)) ;Value: 292
; Order of the list does not matter since search is performed for all
; the combination in our algorithm