有人能向我解释一下这种递归背后的逻辑吗


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就是你得到的答案。

我希望,这会有所帮助。如有任何疑问,请随时发表评论。

最新更新