; Allow max of 9 of each coin
(defun change (quan &optional (coins '(25 10 5 1)) &aux result)
(cond ((zerop quan) (list nil))
((null coins) t)
((> (first coins) quan) (change quan (rest coins)))
(t (dotimes (i (1+ (min 9 (/ quan (first coins)))))
(let ((res (change (- quan (* i (first coins)))
(rest coins))))
(when (listp res)
(if (zerop i)
(setq result (append res result))
(setq result (append (mapcar #'(lambda (x) (cons (list i (car coins)) x))
res)
result))))))
(if (null result) t result))))
syntax highlighted by Code2HTML, v. 0.9.1