我正在尝试学习Lisp语言,并选择了Guile来解决这个问题:
给定一个整数数组coins
,代表不同面额的硬币,以及一个整数amount
,代表总金额。
返回组成该金额所需的最少硬币数量。如果无法用任何组合的硬币凑出该金额,则返回-1。
假设你拥有每种硬币的无限数量。
从根本上讲,我理解动态规划的基本原理,可以使用递归和记忆化来节省在较低深度处进行计算的时间,但作为Lisp,我希望它能完美解决这类问题。我遇到的问题是如何返回每个硬币组合的单独列表。
以目标金额为6,硬币为[2, 3]的示例情况来说明,简单的树形结构如下:
正确答案应该是(3 3),另一个“完整”的解决方案是(2 2 2)。
但是,如果我尝试构建这些东西,我想要使用的形式(不带记忆化)会看起来像这样。
(define get-coins (lambda (coins target)
(cond
((= target 0) '())
; not quite sure how to "terminate" a list here
; An idea is to return (list -1) and then filter
; lists that contain -1
((< target 0) ?????)
(else
; for each coin, recurse
(map (lambda (v)
(cons v (get-coins coins (- target v))))))
)
))
然而,它不会在遍历过程中返回更多的列表。相反,它会创建嵌套的列表。这就是我的问题所在。任何帮助都将不胜感激。