【发布时间】:2015-02-01 07:27:29
【问题描述】:
我正在尝试从 coursera 的 scala 课程中构建我的最后一篇作业,但是我的算法似乎失败了。但是我不明白为什么它失败以及为什么它返回 0。
注意我并不是要解决这个问题。我想解释一下代码发生了什么以及它失败的原因。
def countChange(money: Int, coins: List[Int]): Int = {
def cc(amount: Int, list: List[Int]): Int = {
println(amount, list);
if (amount == 0) 1
if (amount < 0 || list.isEmpty) 0
else cc(amount - list.head, list) + cc(amount, list.tail)
}
cc(money, coins)
}
逻辑是,你可以给给定数量找零的方式的数量等于你可以使用第一种硬币+你可以找零的方式的数量下一种硬币。这导致了一个计算所有方式的递归函数。这是我的逻辑,这也是我试图构建的,但这就是它返回的内容:
(10,List(2, 3, 5))
(8,List(2, 3, 5))
(6,List(2, 3, 5))
(4,List(2, 3, 5))
(2,List(2, 3, 5))
(0,List(2, 3, 5))
(-2,List(2, 3, 5))
(0,List(3, 5))
(-3,List(3, 5))
(0,List(5))
(-5,List(5))
(0,List())
(2,List(3, 5))
(-1,List(3, 5))
(2,List(5))
(-3,List(5))
(2,List())
(4,List(3, 5))
(1,List(3, 5))
(-2,List(3, 5))
(1,List(5))
(-4,List(5))
(1,List())
(4,List(5))
(-1,List(5))
(4,List())
(6,List(3, 5))
(3,List(3, 5))
(0,List(3, 5))
(-3,List(3, 5))
(0,List(5))
(-5,List(5))
(0,List())
(3,List(5))
(-2,List(5))
(3,List())
(6,List(5))
(1,List(5))
(-4,List(5))
(1,List())
(6,List())
(8,List(3, 5))
(5,List(3, 5))
(2,List(3, 5))
(-1,List(3, 5))
(2,List(5))
(-3,List(5))
(2,List())
(5,List(5))
(0,List(5))
(-5,List(5))
(0,List())
(5,List())
(8,List(5))
(3,List(5))
(-2,List(5))
(3,List())
(8,List())
(10,List(3, 5))
(7,List(3, 5))
(4,List(3, 5))
(1,List(3, 5))
(-2,List(3, 5))
(1,List(5))
(-4,List(5))
(1,List())
(4,List(5))
(-1,List(5))
(4,List())
(7,List(5))
(2,List(5))
(-3,List(5))
(2,List())
(7,List())
(10,List(5))
(5,List(5))
(0,List(5))
(-5,List(5))
(0,List())
(5,List())
(10,List())
0
您可以看到它返回 0,即使从打印的调用中可以看出它所采取的步骤似乎正是我的逻辑试图实现的目标。
这是主函数中函数的调用:
println ("" + countChange(10,List(2,3,5)))
请不要给我可以复制和粘贴的烘焙代码。我想知道我的逻辑有什么问题。
【问题讨论】:
-
+1 不是要求解决方案,而是要求您的代码失败的原因。