硬币改变算法失败

时间:2014-05-08 14:44:33

标签: algorithm scala

我正在尝试从课程中的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)))

请勿提供我可以复制和粘贴的烘焙代码。我想知道我的逻辑有什么问题。

2 个答案:

答案 0 :(得分:3)

您错过了else

  if (amount == 0) 1   // This value is thrown away
  if (amount < 0 || list.isEmpty) 0
  else cc(amount - list.head, list) + cc(amount, list.tail)

只需在第二个if之前添加它,您就可以了。

(如果不清除,只返回最后一个if / else的结果,所以

if (a) 1
if (b) 2
if (c) 3
else 4

只有最后两行才有意义。如果您想选择其中一个选项,

if (a) 1
else if (b) 2
else if (c) 3
else 4

是你需要的。)

答案 1 :(得分:2)

您的错误位于代码的递归部分:

 cc(amount -list.head, list) + cc(amount, list.tail)

如果您查看第一部分,则无需删除head即可再次传递整个列表。这意味着你获得答案的唯一方法就是如果金额完全可以被当前列表头部位置的硬币整除。