【发布时间】:2015-04-01 23:25:14
【问题描述】:
计算更改样式问题,我用 lisp 编写了这个递归,我想知道是否有人有任何技巧可以提高效率?如果数字太大,它就会开始中断,大约需要 3 分钟来计算相当于 10 英镑的不同组合! 即使指出我正确的方向也很好,谢谢!
(defun dollars (amount &optional (coins '(5 10 20 50 100 200 500 1000 2000 5000 10000)))
(cond ((= amount 0) 1)
((or (< amount 0) (= (length coins) 0) (> amount 30000)) 0)
((zerop (mod amount 5))
(+ (dollars (- amount (first coins)) coins)
(dollars amount (rest coins))))))
【问题讨论】:
-
一个非常简单的加速:用
(endp coins)替换(= (length coins) 0)。必须遍历整个列表来计算它的长度,而判断列表是否为空真的很快。 -
太好了!没有意识到这会有很大的不同:)
-
另一个简单的加速:反转硬币列表!然后,当金额小于下一个更高的硬币时,您将为每个剩余的硬币节省两次调用美元。您也可以通过将
(< amount 0)替换为(< amount (first coins))来实现几乎相同的效果。
标签: performance recursion lisp common-lisp