簡體   English   中英

有人可以向我解釋這個遞歸背后的邏輯嗎

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM