因此,我在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。那么递归实际上如何在此代码中起作用?
答案 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+2
是4
,是正确的答案。
似乎您将-1
应用于递归bunnyEars()
调用的返回值,但是代码说将其应用于您要发送的参数,而不是返回值