Java递归提供了两种不同的结果。为什么?

时间:2015-07-30 08:10:37

标签: java algorithm recursion

我对以下代码段的结果有一个模棱两可的理解。请帮我用一个例子清楚地理解这一点。

这是我的第一个代码段:

public static void main(String args[]) {
    int number = 4;
    System.out.print(what(number));
}

public static int what(int number){
    if(number < 2)
        return 1;
    else
        return what(number-2) + what(number -1);
}

结果返回5。但是当尝试为操作数单独运行此递归方法时,两个代码段都返回1作为结果。

以下代码返回1作为结果:

public static int what(int number){
    if(number < 2)
        return 1;
    else
        return what(number-2);
}

这个代码同样适用:

public static int what(int number){
    if(number < 2)
        return 1;
    else
        return what(number-1);
}

我需要了解它是如何工作的。

3 个答案:

答案 0 :(得分:5)

第一种方法对1进行求和,而后一种方法只打印what()的结果,其结果可能不多于或少于1.

第一种方法的例子:

  

什么(4)=什么(2)+什么(3)=什么(0)+什么(1)+什么(1)+什么(2)= 1 + 1 + 1 +什么(0)+什么(1)= 3 + 1 + 1 = 5

或者,如果您想要更好的可视化:

                   what(4)
                  /  +   \
                 /        \        
             what(2)      what(3)
            /   \         /     \
       what(0) what(1) what(1) what(2)
         =1     =1       =1     /  \
                            what(0) what(1)
                              =1      =1

第二种方法的例子:

  

what(4)= what(2)= what(0)= 1

                     what(4)
                       |
                     what(2)
                       |
                     what(0)
                       =1

最终方法的示例:

  

what(4)= what(3)= what(2)= what(1)= 1

                     what(4)
                       |
                     what(3)
                       |
                     what(2)
                       |
                     what(1)
                       =1

答案 1 :(得分:0)

当您为每次递归调用what(number-2) + what(number -1);时,将1添加到现有结果中。

但是当你独立调用它们时,你只是重写先前的计算并返回1。

尝试放置调试点并分析代码是如何运行的。

答案 2 :(得分:0)

对于使用main方法中参数4的方法what()的递归调用,请参阅递归树 -

                    4
                   / \
                  2   3
                     / \
                    1   2

现在,您可以从递归树中看到调用what()的方法是如何发生的。实际上在what()方法中,如果方法的参数大于2,则调用分支为另外两个what()调用。