Scala 在计数更改递归算法中,如果数量=0,为什么要返回1?

Scala 在计数更改递归算法中,如果数量=0,为什么要返回1?,scala,recursion,Scala,Recursion,我正在上coursera课程,为了完成一项作业,我写了一个代码,在给出面额清单的情况下计算金额的变化。通过大量的研究,我找到了各种算法的解释。在递归实现中,基本情况之一是,如果金额为0,则计数为1。我不明白为什么,但这是代码工作的唯一方式。我觉得金额是0,那么就没有办法对其进行更改,我应该抛出一个异常。代码如下所示: function countChange(amount : Int, denoms :List[Int]) : Int = { if (amount == 0 ) return

我正在上coursera课程,为了完成一项作业,我写了一个代码,在给出面额清单的情况下计算金额的变化。通过大量的研究,我找到了各种算法的解释。在递归实现中,基本情况之一是
,如果金额为0
,则
计数为1
。我不明白为什么,但这是代码工作的唯一方式。我觉得金额是0,那么就没有办法对其进行更改,我应该抛出一个异常。代码如下所示:

function countChange(amount : Int, denoms :List[Int]) : Int = {
  if (amount == 0 ) return 1 ....

任何解释都将不胜感激

为了避免特别提到Coursera问题,我将提到一个更简单但类似的问题

两次掷硬币有多少结果?四,

(H,H),(H,T),(T,H),(T,T)
一次抛硬币有多少种结果?二,

(H),(T)
0次掷硬币有多少次结果?一,

()
用递归的方式表示,N次抛硬币有多少次结果?我们把它叫做
f(N)
where

f(N) = 2 * f(N - 1), for N > 0
f(0) = 1
选择
N=0
普通(基本)案例,以便递归定义的非普通案例能够正确工作。因为我们在这个例子中做乘法,乘法的单位元素是1,所以选择它作为基本情况是有意义的


或者,你也可以从组合数学中论证:
n选择0=1
0!=1
,等等。

有一种方法,那就是
{}
,空集。递归按原样工作,因为它将钱分配到零为止(只有在零时才允许更改)。我在Coursera讨论组中发布了一个关于这一点的问题。事实上,问题并没有具体说明,组合数学的答案是暗示性的,但不是确定的。另一种解释是:如果钱是X,但是没有硬币少于X,那么你就不能给零钱(零钱是没有办法的)。这也适用于X==0。