Java 方法执行最后一个打印语句 3 次,即使该方法只被调用一次

标签 java

我试图弄清楚为什么 Java 中的这个神秘方法会打印出“43211234”。我理解程序如何达到“43211”,但我不确定“if”之后的最后一个 System.out.print(x % 10) 是如何运行 3 次的,并且每次都会将 x 的值带回到当前值之前的值,直到达到 x 的值“1234”。这是否与递归有关,因为该方法在“if”中被调用了 3 次?我猜这就是类似的事情,因为最后一个也恰好执行了 3 次。我将非常感谢你的帮助。谢谢。

class Main {
    public static void main(String[] args) {
    mystery(1234);
}
public static void mystery(int x) {
    System.out.print(x % 10);
    if((x / 10) != 0) {
        mystery(x / 10);
    }
    System.out.print(x % 10);
  }
}

最佳答案

不确定我的答案是否比以前的答案更有用,但我会尝试。因此,基本上,您的程序使用两种类型的递归:后向递归和前向递归。我在这里的回答不是向您描述它们,而是为您提供有关它们的更多信息的起点。

让我们跟踪程序的执行情况: 神秘(1234) -> 打印(4) -> 神秘(123);此时,方法末尾的 System.out.print(x % 10); 尚未被调用,因为您的程序已经进一步递归了。一旦程序从递归深处返回,它将被执行,并将执行剩下的内容。

mystery(1234):
    print(4);
    mystery(123):
        print(3);
        mystery(12):
            print(2);
            mystery(1);
                print(1);
                print(1); //This is the first System.out.print(x % 10); from the end of the method, that is executed
            print(2);
        print(3);
    print(4);

关于Java 方法执行最后一个打印语句 3 次,即使该方法只被调用一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53239788/

相关文章:

java - IDEA 发出警告 'some variable always false'?

java - 无法解决 jsoup 的依赖关系

java - Joda LocalDate - 还是瞬间?

java - 如何通过Cucumber从多个json文件中获取数据进行验证?

java - 从 Com 端口 java 读取

java - Java 中的封闭/嵌套接口(interface)

java - 如何在 aem groovy 控制台中获取服务?

java - 使用 Grid/FlowLayout 的 JProgressbar 宽度

java - 在 mallet 中为我的数据集创建自定义模式

java - 不知道如何使用 iText (Java) 在 pdf 文件中创建居中的 "image + text"水印