![](/img/trans.png)
[英]i do not get the logic behind this code. Can someone please explain to me what it really does and how?
[英]Can someone explain to me the logic behind this recursion
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
如何工作的吗?
从您的评论中,我了解到您已经知道递归调用的含义。 为了弄清楚它是如何工作的,您可以通过某种方式跟踪调用。 下面给出了其中一种方法的示例:
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 是您得到的答案。
我希望,它有帮助。 如有任何疑问,请随时发表评论。
如果数字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 % 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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.