![](/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.