Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何在使用递归解决硬币兑换问题时解决堆栈溢出错误_Scala - Fatal编程技术网

Scala 如何在使用递归解决硬币兑换问题时解决堆栈溢出错误

Scala 如何在使用递归解决硬币兑换问题时解决堆栈溢出错误,scala,Scala,我在运行下面的硬币兑换问题函数时遇到堆栈溢出错误 { def countchanger(m: Int, c:List[Int]): Int = { if (money == 0 || coins.isEmpty) 1 else if (money < 0) 0 else countchanger(money - coins.head, coins) + countchanger(money, coins.tail)

我在运行下面的硬币兑换问题函数时遇到堆栈溢出错误

    {

      def countchanger(m: Int, c:List[Int]): Int = {

        if (money == 0 || coins.isEmpty) 1
        else if (money < 0) 0
        else countchanger(money - coins.head, coins) + countchanger(money, coins.tail)
      }
      countchanger(money, coins.sorted)
}
{
def countchanger(m:Int,c:List[Int]):Int={
如果(货币=0 | |硬币。i空)1
否则,如果(钱<0)0
else计数变换器(货币-硬币.头部,硬币)+计数变换器(货币,硬币.尾部)
}
计数变换器(货币、硬币、分类)
}
感谢在理解堆栈溢出错误的原因以及如何以更好的方式编写此函数方面提供的帮助

当countchanger功能从countChange功能中删除时,这不是问题

def countChange(money: Int, coins: List[Int]): Int =
    {

      if ((money < 0) || coins.isEmpty) 0
      else if (money == 0) 1
      else countChange(money - coins.head, coins) + countChange(money, coins.tail)

    }
def countChange(货币:Int,硬币:List[Int]):Int=
{
如果((货币<0)| |硬币。我是空的)0
如果(货币==0)1
else countChange(money-coins.head,coins)+countChange(money,coins.tail)
}

在代码中,您称coins.tail和coins.head,而不是c.tail和c.head。这意味着,从第二次迭代开始,函数将使用相同的输入参数无休止地调用自己,因此永远不会完成并达到允许的最大递归调用深度。一个很好的例子说明了为什么维护变量名的范围很重要

不知怎的,我怀疑你是自己做这个练习的。但无论如何。原始代码块中的问题是在countchanger中调用coins.head和coins.tail,而不是c.head和c.tail。这里的内部函数无论如何都是不必要的。而且,您的格式很奇怪,您只展示了原始函数的一部分,而不是全部。这使得它很难帮助你。@user6337现在我看到这是一个基本的参数问题,在货币和硬币中应该用m和c代替。但我注意到,由于叠加流错误,我认为这个问题只能通过尾部递归来解决。谢谢如果你选择Coursera课程,我建议你仔细听讲座,自己解决问题。这样你会学到更多。换句话说,不要偷看答案。我觉得这门课对你来说太难了。如果这是真的,你应该换到另一个你可以自己做作业的地方。你可以寻求帮助,但你不应该在解决问题之前先看答案。你什么也学不到,那样只会浪费你的时间。如果这仍然是你参加课程的第一周,你仍然可以放弃它,要求全额退款。看看密歇根大学的“Python for Python”课程。您随时可以在准备好后返回Scala。