数え上げ (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 すれば良い。
それにしてもなんと言えば良いかわかりませんが、微妙。