数え上げ
要件としては
- ある数の両替パターンを全部数え上げたい
- まず、要素の合計がある数以下なリストの集合を取得したい
という事になります。釣り銭のパターンとしては
(define candidate-list '(50 25 10 5 1))
で、例えば 16 が_ある数_としたら make-list という以下の手続きで釣り銭候補は列挙できる。
(define (make-list n l) (cond ((null? l) '()) ((>= n (car l)) l) (else (make-list n (cdr l)))))
で、ここからが昨晩もハマッてた部分。ちなみに現時点で解に至ってません。
とりあえず
戻りは略しますが以下がでっち上がってます。
(define (enum-candidate lst n candidate) (map (lambda (x) (let ((test (append lst (list x)))) (cond ((> n (apply + test)) (enum-candidate test n (make-list x candidate-list))) ((= n (apply + test)) test) (else '())))) candidate))
数え上げと言いつつ解が出ちゃってます。しかも map 使って再帰してるからもの凄いリストが出てきます。今日はもう寝る。