递归方法打印4次

时间:2017-07-30 02:23:25

标签: java recursion

所以我正在学习如何通过Java使用递归。我写了一个简单的程序,它将所有数字添加到1和n之间,它看起来就是这样做的。我感到困惑的是print语句,它会打印4次(对于解决方案的每个较小部分的每个结果),如果再次调用该方法并且条件还没有达到打印语句,我感到很困惑满意。我理解这可以通过在main方法中创建一个int变量并将返回值分配给它来规避。

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;
}

4 个答案:

答案 0 :(得分:1)

让我解释为什么会这样。

您的第二个print语句打印除test=> update foo set field1='10000000000000', field2='100000000000000' where id=1; ERROR: value "10000000000000" is out of range for type integer LINE 1: update foo set field1='10000000000000', field2='100000000000... ^ = 1时的所有和值。当test=> \set VERBOSITY verbose test=> update foo set field1=10000000000000, field2=100000000000000 where id=1; ERROR: 22003: integer out of range LOCATION: int84, int8.c:1298 test=> update foo set field1='10000000000000', field2='100000000000000' where id=1; ERROR: 22003: value "10000000000000" is out of range for type integer LINE 1: update foo set field1='10000000000000', field2='100000000000... ^ LOCATION: pg_atoi, numutils.c:75 = 1时,第一个print语句将打印出值

以这种方式思考:每个非void方法调用都将返回。如果它没有返回,它将继续执行,直到达到return语句。

你说第二个print语句应该只打印最后一个和值。但是你看,该方法只能返回两个位置 - 在n语句中,或在方法结束时。当n为1时,前一个位置只到达一次,这意味着该方法的另外四次将通过最后的return语句返回。要在最后到达return语句,必须执行第二次打印。这意味着第二个print语句必须执行四次!

使用调试器逐步完成代码。这是最容易理解实际发生的事情。

答案 1 :(得分:1)

我已经绘制了一个序列图,希望这可以解释递归过程。

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

The Process of Recursion

答案 2 :(得分:0)

这是因为在else下方的第二个打印声明。 在执行时,调用递归函数并且它不会 到达底部的打印声明。但是在n = 1之后,即执行if条件然后它返回函数递归(2-1)并转到down并返回sum(也是print)并将sum的值返回到递归的位置(3- 1)被称为等等。这是打印每笔钱的地方。

仅打印最终总和的代码如下所示。打印仅包含在主打印最终答案中 我希望这将有所帮助。

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;

    }

}

答案 3 :(得分:0)

当递归堆栈已满时,它会从尾部开始清空。这就是if语句下面的print语句开始执行的原因。注意:递归过程将返回其调用的值,因此如果条件不满足,则返回到该点,但整个递归过程将继续,直到堆栈清空为止。 无论我说什么都是所谓的尾递归。