理系学生日記

おまえはいつまで学生気分なのか

問題2-19

こんなのが与えられてて、たとえば10円の出し方が何通りあるかを計算できる。

(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)))))

こんな風に。

gosh> (cc 10 (list 500 100 50 10 5 1))
4
  • 10円玉1枚
  • 5円玉2枚
  • 5円玉1枚,1円玉5枚
  • 1円玉10枚

で4通り。
それ実現するためにどうすれば良いのかなぁみたいなことなんですが、そのまんまぽい。

(define (first-denomination l) (car l))
(define (except-first-denomination l) (cdr l))
(define no-more? null?)