首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java递归提供了两个不同的结果。为什么?

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

Stack Overflow用户
提问于 2015-07-30 08:10:37
回答 3查看 105关注 0票数 1

对于以下代码段的结果,我有一个模糊的理解。请以一个例子来帮助我清楚地理解这一点。

这是我的第一个代码段:

代码语言:javascript
复制
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作为结果:

代码语言:javascript
复制
public static int what(int number){
    if(number < 2)
        return 1;
    else
        return what(number-2);
}

同样的情况也适用于这个代码:

代码语言:javascript
复制
public static int what(int number){
    if(number < 2)
        return 1;
    else
        return what(number-1);
}

我得弄明白这是怎么回事。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-30 08:14:04

第一种方法与1之和,而后一种方法只打印what()的结果,它可以是1,也可以是1。

第一种方法的例子:

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

或者,如果你想要一个更好的可视化:

代码语言:javascript
复制
                   what(4)
                  /  +   \
                 /        \        
             what(2)      what(3)
            /   \         /     \
       what(0) what(1) what(1) what(2)
         =1     =1       =1     /  \
                            what(0) what(1)
                              =1      =1

第二种方法的例子:

什么(4)=什么(2)=什么(0)=1

代码语言:javascript
复制
                     what(4)
                       |
                     what(2)
                       |
                     what(0)
                       =1

最后一种方法的例子:

什么(4)=什么(3)=什么(2)=什么(1)=1

代码语言:javascript
复制
                     what(4)
                       |
                     what(3)
                       |
                     what(2)
                       |
                     what(1)
                       =1
票数 5
EN

Stack Overflow用户

发布于 2015-07-30 08:16:15

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

但是,当您独立调用它们时,您只是简单地重写了前面的计算并返回1。

尝试放置一个调试点并分析代码的运行情况。

票数 0
EN

Stack Overflow用户

发布于 2015-07-30 08:21:52

有关主方法中带有参数4的方法what()的递归调用,请参见递归树-

代码语言:javascript
复制
                    4
                   / \
                  2   3
                     / \
                    1   2

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31718411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档