首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归方法打印4次

递归方法打印4次
EN

Stack Overflow用户
提问于 2017-07-30 02:23:24
回答 4查看 595关注 0票数 0

因此,我正在学习如何通过Java使用递归。我编写了一个简单的程序,它把1到n之间的所有数字相加,看起来就能完成它的工作。让我感到困惑的地方是print语句,它打印4次(针对解决方案的每个较小部分的每个结果),如果再次调用该方法而条件尚未满足,那么它是如何到达print语句的。我理解这可以通过在主方法中创建一个int变量并将返回分配给它来解决。

代码语言:javascript
复制
public static void main(String[] args) {

    int sum = recursiveCall(5);
}

public static int recursiveCall(int num) {

    int sum = 0;

    if(num == 1) {

        sum = 1;
        System.out.println(sum);
        return sum;
    }
    else {

        sum = recursiveCall(num - 1) + num;
    }

    // Notice it prints out all results of sum, not just the final value.
    System.out.println(sum);

    return sum;
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-07-30 03:57:34

我画了一个序列图,希望这能解释递归过程。

递归有一个追溯过程,在调用递归方法之前,下一个命令将被推入调用堆栈。因此,我们可以简单地说,System.out.println将在recursiveCall之前被推到调用堆栈,然后在recursiveCall返回之后,主进程将继续使用堆栈上的top命令,即System.out.println

票数 1
EN

Stack Overflow用户

发布于 2017-07-30 02:35:24

让我解释一下为什么会发生这种情况。

第二个打印语句打印除n =1时以外的所有和值。当n =1时,第一个打印语句将打印出该值。

请这样想:每个非空方法调用都将返回。如果它不返回,它将继续执行,直到到达返回语句为止。

您说第二个print语句应该只打印最后一个sum值。但是,您可以看到,该方法只能返回两个位置--在if (num == 1)语句中,或者在方法的末尾。当n为1时,只到达前一个位置一次,这意味着其他四次方法将通过返回语句在末尾返回。要到达返回语句的末尾,必须执行第二次打印。这意味着第二个print语句必须执行四次!

使用调试器一步一步地完成代码。这是最容易理解的实际情况。

票数 1
EN

Stack Overflow用户

发布于 2017-07-30 02:38:13

这是因为下面的第二个打印语句。在执行时,调用递归函数,它不会到达底部的print语句。但是在n=1 ie执行if条件之后,它返回到函数递归(2-1),然后返回下和和(也是打印),并将sum值返回到调用递归(3-1)的位置,等等。。这就是它打印每个和的地方。

一个代码,只打印最后的和是给below.Print是包括在主打印最后答案,只有我希望这将有所帮助。

代码语言:javascript
复制
public class add {

    public static void main(String[] args) {

        int sum = recursiveCall(5);
        System.out.println(sum); // this will print 15
    }

    public static int recursiveCall(int num) {

        int sum = 0;

        if(num == 1) {

            sum = 1;
            //System.out.println(sum); this will print 1
            return sum;
        }
        else {

            sum = recursiveCall(num - 1) + num;
        }
        // System.out.println(sum); //this is the reason for each sum.
        return sum;

    }

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

https://stackoverflow.com/questions/45395773

复制
相关文章

相似问题

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