即使不满足条件,Java是否完全了解整个递归方法?
Is Java fully aware of the entire recursive method even if the condition is not met?
我想用非常简单的术语来理解如果 Java 在方法中不满足时读取超出条件,我知道如果不满足条件它不会执行该部分?或者甚至不想浪费时间阅读该部分?
我已将代码附加到此消息中供您查看。
我最初以为当我 运行 代码时,我只会看到一个数字:-1 就是这样,但它列出了所有数字。
我理解为什么他们从 Java 堆栈中倒退。所以,很明显,Java 堆栈上有很多递归调用(如果说错了,请原谅。)
但在我看来,只有 Java interpreted/read 整个方法在每次递归时,每次都执行整个整个代码,并保存 的值n,但选择不输出结果或搁置(但已经在幕后执行)。
谢谢大家,
等不及要阅读您的答案了。
P.S。我是一名 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);
}
}
了解 assembly/machine 代码以及计算机实际如何解释您编写的代码可能会有所帮助。
您编写的 Java 代码被编译(转换)为机器的单独指令 运行。当函数调用发生时,它们会将调用它们的函数(调用者)的当前状态保存到堆栈(变量值)中。这样当函数returns时那个状态就可以恢复到原来的样子了。
在您的示例中,当 reduceByOne(n-1)
调用发生时,它将 n
的当前值的状态保存到堆栈并开始 运行 对 reduceByOne()
函数。在该函数调用完成并 returns 返回后,状态将恢复到之前的状态并执行下一行代码(打印出 n
)。
没有任何预读,然后加载程序的所有指令,然后一次执行每条指令。有时一行代码会转换成多条指令。对于 multithreading/efficient 处理器,这可能有点不同,但对于您来说,这就是程序的工作方式。
我不确定这里的问题是什么。一切都很明显。让我们一步步过一遍。为了缩短事情让我们想象我们从 main 调用 reduceByOne(1)
而不是 reduceByOne(10)
.
- main 方法被调用,它调用 n==1 的 reduceByOne
- reduceByOne 被 n==1 调用,if 语句检查 n 并再次调用 reduceByOne(我们称之为 reduceByOne')n'==0,因此
- reduceByOne' 以 n'==0 调用,if 语句检查 n 并以 n''==-1 调用 reduceByOne'',因此
- reduceByOne'' 使用 n''==-1 调用,if 语句检查 n 并且什么都不做。下一行是打印出 -1 的 println n''。然后 reduceByOne'' returns,将控制权交还给 reduceByOne'
- reduceByOne' 在 if 语句之后继续,打印输出 0 的 n' 和 returns,它将控制权交还给 reduceByOne
- reduceByOne 在 if 语句之后继续,打印输出 1 的 n 和 returns,它将控制权传回主方法
- main 方法没有更多的行并且存在。 JVM 退出,因为 main 方法已经退出。结束.
P.S。让我们尝试以图形方式呈现流程:
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
}
我想用非常简单的术语来理解如果 Java 在方法中不满足时读取超出条件,我知道如果不满足条件它不会执行该部分?或者甚至不想浪费时间阅读该部分?
我已将代码附加到此消息中供您查看。
我最初以为当我 运行 代码时,我只会看到一个数字:-1 就是这样,但它列出了所有数字。
我理解为什么他们从 Java 堆栈中倒退。所以,很明显,Java 堆栈上有很多递归调用(如果说错了,请原谅。)
但在我看来,只有 Java interpreted/read 整个方法在每次递归时,每次都执行整个整个代码,并保存 的值n,但选择不输出结果或搁置(但已经在幕后执行)。
谢谢大家, 等不及要阅读您的答案了。
P.S。我是一名 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);
}
}
了解 assembly/machine 代码以及计算机实际如何解释您编写的代码可能会有所帮助。
您编写的 Java 代码被编译(转换)为机器的单独指令 运行。当函数调用发生时,它们会将调用它们的函数(调用者)的当前状态保存到堆栈(变量值)中。这样当函数returns时那个状态就可以恢复到原来的样子了。
在您的示例中,当 reduceByOne(n-1)
调用发生时,它将 n
的当前值的状态保存到堆栈并开始 运行 对 reduceByOne()
函数。在该函数调用完成并 returns 返回后,状态将恢复到之前的状态并执行下一行代码(打印出 n
)。
没有任何预读,然后加载程序的所有指令,然后一次执行每条指令。有时一行代码会转换成多条指令。对于 multithreading/efficient 处理器,这可能有点不同,但对于您来说,这就是程序的工作方式。
我不确定这里的问题是什么。一切都很明显。让我们一步步过一遍。为了缩短事情让我们想象我们从 main 调用 reduceByOne(1)
而不是 reduceByOne(10)
.
- main 方法被调用,它调用 n==1 的 reduceByOne
- reduceByOne 被 n==1 调用,if 语句检查 n 并再次调用 reduceByOne(我们称之为 reduceByOne')n'==0,因此
- reduceByOne' 以 n'==0 调用,if 语句检查 n 并以 n''==-1 调用 reduceByOne'',因此
- reduceByOne'' 使用 n''==-1 调用,if 语句检查 n 并且什么都不做。下一行是打印出 -1 的 println n''。然后 reduceByOne'' returns,将控制权交还给 reduceByOne'
- reduceByOne' 在 if 语句之后继续,打印输出 0 的 n' 和 returns,它将控制权交还给 reduceByOne
- reduceByOne 在 if 语句之后继续,打印输出 1 的 n 和 returns,它将控制权传回主方法
- main 方法没有更多的行并且存在。 JVM 退出,因为 main 方法已经退出。结束.
P.S。让我们尝试以图形方式呈现流程:
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
}