即使不满足条件,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
}