繁体   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