递归给出了意外/错误的输出?

时间:2018-08-09 19:17:47

标签: java recursion

因此,我在codingbat上进行了递归挑战,并遇到了“兔子耳朵”的问题,在这个问题中,我们有许多兔子,每个兔子都有两个大的软盘耳朵。我们要递归计算所有兔子的耳朵总数(无循环或乘法)。

解决方案显然很简单:

public int bunnyEars(int bunnies)
{
    if(bunnies == 0)
        return 0;
    return 2+bunnyEars(bunnies-1);
}

但是我听不懂。如果我们在bunnyEars(2)方法中传递2,则 递归部分bunnyEars(bunnies-1);减法后应在括号中保留1,因此为2+(1);应该等于3而不是4。
但是输出为4。那么递归实际上如何在此代码中起作用?

2 个答案:

答案 0 :(得分:2)

不是2+(1),而是2 + numberOfEarsOfBunnies(1)== 2 + 2。
我对该函数进行了一些重命名,使其更加明显。

或更详细:

numberOfEarsOfBunnies(2)==
2 + numberOfEarsOfBunnies(1)==
2+(2 + numberOfEarsOfBunnies(0))==
2+(2 + 0)==
2 + 2 ==
4

答案 1 :(得分:0)

  

如果我们在bunnyEars(2)方法中传递2,则递归部分bunnyEars(bunnies-1);减法后应在括号中保留1,因此为2+(1);应该等于3而不是4。

您似乎误读了该表达式。有问题的代码行显示

return 2+bunnyEars(bunnies-1);

现在您致电bunnyEars(2),所以bunnies == 2;然后到达这一行代码。

return 2+bunnyEars(bunnies-1);

解析为

return 2+bunnyEars(2-1);

return 2+bunnyEars(1);

因此bunnyEars()函数的第二个实例开始运行,bunnies == 1。它到达了同一行代码,这一次

return 2+bunnyEars(bunnies-1);

return 2+bunnyEars(1-1);

return 2+bunnyEars(0);

因此bunnyEars() 1/3 实例将与bunnies == 0一起运行;但这与您的基本情况相符,因此您只返回0;这次我们不递归。所以备份一个级别,我们发现

return 2+bunnyEars(0);

return 2+0; // because bunnyEars(0) returned 0

该实例返回2。这意味着

return 2+bunnyEars(1);

成为

return 2+2; // because bunnyEars(1) returned 2

当然,2+24,是正确的答案。

似乎您将-1应用于递归bunnyEars()调用的返回值,但是代码说将其应用于您要发送的参数,而不是返回值