数え上げ (2)
できた。と思う。
(define candidate-list '(50 25 10 5 1)) (define (make-list n l) (cond ((null? l) '()) ((>= n (car l)) l) (else (make-list n (cdr l))))) (define (enum-candidate n candidate) (define (ec-inner rslt lst candidate) (if (null? candidate) rslt (let ((test (append lst (list (car candidate))))) (cond ((>= n (apply + test)) (let ((tmp (ec-inner (append rslt (list test)) test (make-list (let last-i ((lst test)) (if (null? (cdr lst)) (car lst) (last-i (cdr lst)))) candidate-list)))) (if (null? (cdr candidate)) tmp (ec-inner tmp lst (cdr candidate))))) (else (ec-inner rslt lst (cdr candidate))))))) (ec-inner '() '() candidate))
あとは filter して accumulate すれば良い。
それにしてもなんと言えば良いかわかりませんが、微妙。