public int bunnyEars(int n) {
if (n < 0) {
throw new IllegalArgumentException();
}
if (n == 0) {
return n;
}
if (n % 2 == 1)
return 2 + bunnyEars(n - 1);
return 3 + bunnyEars(n - 1);
}
有人能解释一下bunnyEars(2) = 5
以及它是如何工作的?
如果数字n
小于0,则抛出IllegalArgumentException,如所示
if (n < 0) {
throw new IllegalArgumentException();
}
所以,我们知道n
总是应该是0或更大。我们还知道,当n
等于0时,该方法应该返回,如下所示:
if (n == 0) {
return n;
}
因此,据推测,方法public int bunnyEars(int n)
将取一个等于或大于零的数字,并开始添加整数,直到n
为零。
我们看到了两种不同的可能场景,用n
大于零并对其进行处理:
if (n % 2 ==1)
return 2 + bunnyEars(n-1);
return 3 + bunnyEars(n -1); //else
这里发生的情况是,如果n
%2等于1(意味着这个数字是奇数,因为每个奇数整数除以2都有1的余数(,那么该方法将以当前n
减去1的值递归调用,并且要返回的最后一个整数将增加2。
如果这个数字不是奇数(因此是偶数(,那么同样的事情也会发生,但返回的最后一个整数会增加3。
因此,在您的bunnyEars(2)
示例中,我们看到2的n既是正的,也大于零,因此不会抛出错误,并且该方法不会在没有递归的情况下返回。由于2是偶数(2%是0(,因此使用第二return
。这意味着3+bunnyEars(1(被调用。
由于1也大于0,我们再次使用递归方法。由于1是奇数(1%2是1(,因此调用第一个递归返回。这意味着我们称之为2+bunnyEars(0(。
现在,由于n是0,所以使用if语句中的return n
:
if (n == 0) {
return n;
}
在第一轮中,我们将返回的最后一个整数增加了3,在第二轮中,它增加了2,总共增加了5。所以结果是5。
从您的评论中,我知道您已经知道递归调用的含义。为了弄清楚它是如何工作的,您可以通过某种方式跟踪调用。以下是其中一种方法的示例:
public class Main {
public static void main(String[] args) throws InterruptedException {
System.out.println(bunnyEars(2));
}
static int bunnyEars(int n) {
if (n < 0) {
throw new IllegalArgumentException();
}
if (n == 0) {
System.out.println(n);
return n;
}
if (n % 2 == 1) {
System.out.print("2 + bunnyEars(" + n + "-1) -> ");
return 2 + bunnyEars(n - 1);
}
System.out.print("3 + bunnyEars(" + n + "-1) -> ");
return 3 + bunnyEars(n - 1);
}
}
输出:
3 + bunnyEars(2-1) -> 2 + bunnyEars(1-1) -> 0
5
正如你所看到的,3+2+0=5就是你得到的答案。
我希望,这会有所帮助。如有任何疑问,请随时发表评论。