我想用一个非常简单的术语来理解,如果在方法中不满足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
}