【发布时间】:2015-03-30 05:04:21
【问题描述】:
我最近开始学习 lisp,我认为一个有趣的问题是计数更改算法,它已经尝试了很多次,但是我发现很难弄清楚如何解决这个问题,我想我会尝试使用循环,但它只是不工作。我将把我的两个无用的尝试放在下面,但如果有人对我应该如何从 lisp 的角度考虑这个问题有任何建议,我将不胜感激。 我也更喜欢使用递归解决方案。
我一直在这里查看有关计算变化的问题,但它们都倾向于面向对象,而我需要更实用的东西。 这不是家庭作业,只是私人学习!
(defun dollar (amount)
(let ((l 0) (j 0) (array (make-array '(5 10 20 50 100 200 500 1000 2000 5000 100000))) (results (make-array 50 :initial-element nil))
(do (l 10 (+ l 1))
(do ((= j (aref array l)) amount (+ j 1))
(+ (aref array j) (- (aref results j) (aref array l))))))
))
(defun coin-change (amount coins)
(cond ((< amount 0) 0)
((= amount 5) 1)
((null coins) 0)
(t (+ (make-change-with-coins (- amount (car coins)) coins)
(make-change-with-coins amount (cdr coins)))))
)
样本输入为 (coin-change 20 '(5 10 20 50 100 200 500 1000 2000 5000 100000)) 将返回 4
【问题讨论】:
-
是的,我已经看过你了!它很有用,但我认为我理解得不够,而且我宁愿自己写!
标签: loops recursion count lisp common-lisp