Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 递归方法打印4次_Java_Recursion - Fatal编程技术网

Java 递归方法打印4次

Java 递归方法打印4次,java,recursion,Java,Recursion,所以我正在学习如何通过Java使用递归。我已经写了一个简单的程序,将1和n之间的所有数字相加,它看起来可以完成它的工作。我感到困惑的是print语句,它打印了4次(对于解决方案中每个较小部分的每个结果),我还不清楚如果再次调用该方法并且条件尚未满足,它是如何到达print语句的。我理解,通过在main方法中创建int变量并将返回赋值给它,可以避免这种情况 public static void main(String[] args) { int sum = recursiveCall(5

所以我正在学习如何通过Java使用递归。我已经写了一个简单的程序,将1和n之间的所有数字相加,它看起来可以完成它的工作。我感到困惑的是print语句,它打印了4次(对于解决方案中每个较小部分的每个结果),我还不清楚如果再次调用该方法并且条件尚未满足,它是如何到达print语句的。我理解,通过在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;
}

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

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

这样考虑:每个非void方法调用都将返回。如果它不返回,它将继续执行,直到到达return语句

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


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

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

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

这样考虑:每个非void方法调用都将返回。如果它不返回,它将继续执行,直到到达return语句

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


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

这是因为else下面的第二条print语句。 在执行时调用递归函数,但不调用 到达底部的打印语句。但在n=1之后,即如果条件被执行,那么它将返回到函数recursive(2-1),并返回向下和返回的sum(也是打印),并将sum的值返回到调用recursive(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;

    }

}

这是因为else下面的第二个print语句。 在执行时调用递归函数,但不调用 到达底部的打印语句。但在n=1之后,即如果条件被执行,那么它将返回到函数recursive(2-1),并返回向下和返回的sum(也是打印),并将sum的值返回到调用recursive(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;

    }

}

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

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


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

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


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

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

递归打印不能通过在main方法中创建int变量来避免。
recursiveCall()之后立即假设
方法在else块中被调用,它打印
4次,除了
num==1
并从方法返回。递归打印不能是ci