即使条件不满足,Java是否完全了解整个递归方法?

问题描述 投票:0回答:2

我想用非常简单的术语来理解,如果Java在某个方法中没有遇到超出条件,我知道如果条件不满足它就不会执行该部分吗?或者甚至不想浪费时间阅读那部分?

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

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

我理解为什么他们从Java Stack向后退出。所以,显然,Java堆栈上有大量的递归调用(如果说错了,请原谅。)

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

谢谢大家,迫不及待地想看看你的答案。

附:我是一名Java学生,目前我正在学习Java Structures。所以你的言语越容易,我就越了解你。但无论有什么尝试可以帮助我,我都很感激。

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);
    }
}
java recursion heap-memory
2个回答
2
投票

我不确定这里的问题是什么。一切都很明显。让我们一步一步来看看吧。为了缩短事物让我们想象我们从主要而不是reduceByOne(1)调用reduceByOne(10)

  • 调用main方法并调用reduceByOne,其中n == 1
  • 如果语句检查n并使用n'== 0再次调用reduceByOne(让我们称之为reduceByOne'),则调用reduceByOne,其中n == 1
  • 如果语句检查n并且使用n'= = - 1调用reduceByOne''调用reduceByOne',则调用n'== 0
  • 如果语句检查n并且什么也不做,则使用n''== - 1调用reduceByOne''。下一行是println n'',它打印出-1。然后reduceByOne''返回,将控制权传递给reduceByOne'
  • reduceByOne'在if语句后继续,输出n',输出0并返回,将控制权传递给reduceByOne
  • reduceByOne在if语句之后继续,输出n输出1并返回,将控制权传递给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
}

0
投票

理解汇编/机器代码以及计算机如何实际解释您正在编写的代码可能会有所帮助。

您编写的这个Java代码被编译(转换)为单独的指令,供机器运行。当函数调用发生时,它们将调用它们的函数(调用者)的当前状态保存到堆栈(变量值)。这样,当函数返回该状态时,可以恢复到以前的状态。

在您的示例中,当reduceByOne(n-1)调用发生时,它将n的当前值的状态保存到堆栈并开始运行reduceByOne()函数的新调用。在该函数调用完成并返回之后,状态将恢复到之前的状态并执行下一行代码(打印出n)。

没有任何东西预先读取,然后它加载程序的所有指令,然后一次执行一个指令。有时,一行代码被转换为多个指令。对于多线程/高效处理器,这可能有点不同,但对于您来说,这就是程序的工作方式。

© www.soinside.com 2019 - 2024. All rights reserved.