0

刚开始学习函数式编程,但我无法理解它。这就是我目前拥有的,我知道它为什么不起作用(因为 comb 是不可变的),但我似乎无法思考如何做我想做的事。

  def countChange(money: Int, coins: List[Int]): Int = {
    def rCountChange(money: Int, coins: List[Int], comb: Int): Int = {
      if (money >= coins(0)) rCountChange(money - coins(0), coins, comb)
      if (money == 0) comb + 1 //base case sequence found
      if (coins.isEmpty) comb //base case sequence not found
      rCountChange(money, coins tail, comb)
    }
    rCountChange(money, coins, 0)

  }

我想过让一个数组成为一个数组,然后将其附加到它上面并对结果进行 .length 处理,但这似乎只是一种使用可变 var 的噱头方式。

如果我用 println("combination found") 替换 comb + 1 它会打印找到的正确数量的基本案例,所以我很确定它正确地遍历了所有可能性。

谢谢

4

2 回答 2

2

为了提供一些背景知识,这个问题是针对 Odersky 在 Coursera 上的课程中的一项作业。我碰巧有通过他的测试的解决方案,并且想在不放弃完整实现的情况下给你一个提示。截至目前,Vlad 和 alex23 的答案都没有通过测试。

关键是在两个方向上递归:硬币方面和金钱方面(你在正确的轨道上),直到你遇到基本情况。除非达到基本案例,否则每个案例都应返回其重复次数的总和,而不仅仅是一个或另一个。

于 2013-04-04T17:18:36.050 回答
1

您在else's 的末尾缺少 ' ifs,或者您可以使用return.

因为它是函数在遇到案例后会继续评估并且不会按照您的预期返回。在没有return关键字的情况下,Scala 将最后一个表达式的结果视为函数的一部分作为返回值,在您的情况下,它总是rCountChange(money, coins tail, comb)导致无限递归。

这里:

def countChange(money: Int, coins: List[Int]): Int = {
  def rCountChange(money: Int, coins: List[Int], comb: Int): Int = {
    if (money >= coins(0)) rCountChange(money - coins(0), coins, comb) 
    else if (money == 0) comb + 1 //base case sequence found
    else if (coins.isEmpty) comb //base case sequence not found
    else rCountChange(money, coins tail, comb)
  }
  rCountChange(money, coins, 0)

}

或者:

def countChange(money: Int, coins: List[Int]): Int = {
  def rCountChange(money: Int, coins: List[Int], comb: Int): Int = {
    if (money >= coins(0)) return rCountChange(money - coins(0), coins, comb) 
    if (money == 0) return comb + 1 //base case sequence found
    if (coins.isEmpty) return comb //base case sequence not found
    rCountChange(money, coins tail, comb)
  }
  rCountChange(money, coins, 0)

}
于 2013-04-04T16:46:35.967 回答