我想用一个非常简单的术语来理解,如果在方法中不满足Java的要求,它是否超出了条件的读取范围,我知道如果不满足条件,它就不会执行该部分?还是不浪费时间阅读那部分内容?

我已将代码附加到此消息中,以供您查看。

最初,我以为在运行代码时,我只会看到一个数字:-1,就是这样,但是它会将所有数字都向后列出。

我理解为什么它们会从Java Stack中倒退。因此,显然,在Java Stack上有很多递归调用(如果说错了,请原谅。)

但是在我看来,只有Java在每次递归中都解释/读取整个方法,每次都执行整个ENTIRE代码,并保存n的值,但选择不输出结果或将其搁置时(已经在后台执行了)。

谢谢你们,
等不及要阅读您的答案了。

附言我是一名Java学生,并且目前正在学习Java结构。因此,您说的话越容易,我就会越了解您。但是我很感激,不管有什么尝试可以帮助我。

public class Recursion {

    public static void main(String[] args) {

        reduceByOne(10);

    }

    public static void reduceByOne(int n) {
        if(n >= 0) {
            reduceByOne(n-1);
        }

        System.out.println(n);
    }
}

最佳答案

我不确定这里的问题是什么。一切都很明显。让我们逐步解决它。为了缩短内容,我们假设我们从main而不是reduceByOne(1)调用reduceByOne(10)


调用main方法,并以n == 1调用reduceByOne
如果语句检查n并以n'== 0再次调用reduceByOne(让我们称它为reduceByOne'),则用n == 1调用reduceByOne,因此
如果语句检查n并使用n''==-1调用reduceByOne'',则用n'== 0调用reduceByOne',因此
如果语句检查n并且不执行任何操作,则用n''==-1调用reduceByOne''。下一行是println n'',它输出-1。然后reduceByOne''返回,这将控制权传递回reduceByOne'
reduceByOne'在if语句之后继续,输出输出0并返回的n',将控制权传递回reduceByOne
reduceByOne在if语句之后继续,输出输出1并返回的n,并将控制权返回给main方法
main方法没有更多行并且存在。 JVM退出是因为main方法已退出。结束。


附言让我们尝试以图形方式呈现流程:

public static void main(String[] args) {
    reduceByOne(1) => { // call of reduceByOne with n==1
        if( 1>=0 )  {
            reduceByOne(0) => { // call of reduceByOne' with n'==0
                if(0>=0) {
                    reduceByOne(-1) => { // call of reduceByOne'' with n''==-1
                        if(-1==0) // does nothing
                        System.out.println(-1)
                    } // return back to reduceByOne'
                }
                System.out.println(0)
            } // return back to reduceByOne
        }
        System.out.println(1);
    } // return back to main
}

07-23 21:03