【问题标题】:Recursion gives unexpected/wrong output?递归给出意外/错误的输出?
【发布时间】:2018-08-10 03:35:58
【问题描述】:

所以我在codingbat 上进行递归挑战时遇到了“兔子耳朵”问题,我们有很多兔子,每只兔子都有两个松软的大耳朵。我们想递归地计算所有兔子的耳朵总数(没有循环或乘法)。

解决方案显然很简单:

public int bunnyEars(int bunnies)
{
    if(bunnies == 0)
        return 0;
    return 2+bunnyEars(bunnies-1);
}

但我无法理解。如果我们在 bunnyEars(2) 方法中传递 2 递归部分 bunnyEars(bunnies-1);减法后括号中应该有 1,因此是 2+(1);应该等于 3 而不是 4。
但是输出是 4。那么递归在这段代码中实际上是如何工作的呢?

【问题讨论】:

    标签: java recursion


    【解决方案1】:

    不是 2+(1),而是 2+numberOfEarsOfBunnies(1) == 2+2。
    我稍微重命名了函数以使其更明显。

    或者更详细:

    numberOfEarsOfBunnies(2)==
    2+numberOfEarsOfBunnies(1)==
    2+(2+numberOfEarsOfBunnies(0))==
    2+(2+0)==
    2+2==
    4

    【讨论】:

    • 好的,现在明白了!
    • 我的荣幸。 ;-)
    【解决方案2】:

    如果我们在 bunnyEars(2) 方法中传递 2 递归部分 bunnyEars(bunnies-1);减法后括号中应该有 1,因此是 2+(1);应该等于 3 而不是 4。

    您似乎误读了该表达式。有问题的代码行说

    return 2+bunnyEars(bunnies-1);
    

    现在你打电话给bunnyEars(2),所以bunnies == 2;然后你到达这行代码。

    return 2+bunnyEars(bunnies-1);
    

    解决

    return 2+bunnyEars(2-1);
    

    return 2+bunnyEars(1);
    

    所以bunnyEars() 函数的第二个实例开始运行,bunnies == 1。它到达同一行代码,这次

    return 2+bunnyEars(bunnies-1);
    

    return 2+bunnyEars(1-1);
    

    return 2+bunnyEars(0);
    

    所以bunnyEars()第三个​​ 实例开始运行,bunnies == 0;但这符合您的基本情况,因此您只需返回 0 ;这次我们不递归。所以备份一个我们发现的关卡

    return 2+bunnyEars(0);
    

    return 2+0; // because bunnyEars(0) returned 0
    

    所以实例返回 2。这意味着

    return 2+bunnyEars(1);
    

    变成

    return 2+2; // because bunnyEars(1) returned 2
    

    当然2+24,正确答案。

    似乎您将-1 应用于递归bunnyEars() 调用的返回值,但代码表示将其应用于您发送的参数,而不是返回值。

    【讨论】:

      猜你喜欢
      • 2023-01-25
      • 2015-02-13
      • 2013-09-08
      • 2020-06-29
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多