【问题标题】:Bug in Java when printing factorial recursive method? Output printed before 'printing command'打印阶乘递归方法时Java中的错误?在“打印命令”之前打印的输出
【发布时间】:2020-08-26 06:10:10
【问题描述】:

我目前正在学习 java 并且正在学习递归。我尝试了这两种相同的方法,但我认为其中一种表现得很奇怪。它是Java中的错误吗?还是只有我不懂逻辑。

有人能解释一下吗?

我使用的 JAVA:

java 版本“1.8.0_261”

Java(TM) SE 运行时环境(内部版本 1.8.0_261-b12)

Java HotSpot(TM) 客户端虚拟机(内部版本 25.261-b12,混合模式,共享)

这是我的代码:

第一个案例:

public class App {
public static void main(String[] args) {
    int value = 5;

    System.out.println("Factorial " + value + " = " + faktorial(value));
}

public static int faktorial(int value) {
    
    if (value > 1) {
        System.out.print(value + " * ");
    }
    
    if (value == 1) {
        System.out.println("1");
        return 1;
    }

    return value * faktorial(value-1);
}

}

第一个案例的输出将是:

5 * 4 * 3 * 2 * 1

阶乘 5 = 120

在第二种情况下:

public class App {
public static void main(String[] args) {
    int value = 5;

    System.out.print("Factorial " + value + " = "); //HERE IS THE CHANGE
    System.out.println(faktorial(value)); //HERE IS THE CHANGE
}

public static int faktorial(int value) {
    
    if (value > 1) {
        System.out.print(value + " * ");
    }
    
    if (value == 1) {
        System.out.println("1");
        return 1;
    }

    return value * faktorial(value-1);
}

}

第二个案例的输出将是:

阶乘 5 = 5 * 4 * 3 * 2 * 1

120

【问题讨论】:

  • 它是 Java 中的错误吗? 在所有情况下,您的代码都会有问题,而不是 Java 有问题。请了解 Java 中的运算符优先级及其工作原理。
  • 欢迎来到 Stack Overflow。作为一般性建议,我建议不要保留责备的心理偏见 - 您发现了一个 Java 平台错误,就在您第一次感到困惑之后。你会有很多这样的时刻。 :) 许多聪明的人都在努力将这种美丽的语言保持为有史以来最好的语言之一。您可能会发现一个真正的错误,没有人声称相反,但首先尝试理解 Java 中的简单事物。此外,看看你的 faktorial 方法做了什么。
  • 您好 Giorgi,感谢您的回复 :) 此评论指出“您将有很多这样的时刻”。我仍然在弄清楚学习编程的周期。
  • @PradeepSimha 这与运算符优先级无关,而是与评估顺序有关。

标签: java debugging sun


【解决方案1】:

函数faktorial在行中被调用,

System.out.println("Factorial " + value + " = " + faktorial(value));

函数运行时会打印出你写的所有打印语句,当你得到函数faktorial的返回值时,就会打印出"Factorial " + value + " = " + faktorial(value)这一行。

第二个例子也有类似的情况,先打印函数的打印语句,函数返回后,你会得到打印的函数的返回值。

【讨论】:

    【解决方案2】:

    在这行代码中(来自案例 1):

    System.out.println("Factorial " + value + " = " + faktorial(value));
    

    方法faktorial之前调用println
    这就是faktorial 的输出首先出现的原因。

    我建议您使用调试器运行您的代码(每个优秀的 IDE 都有一个)并亲自查看。

    【讨论】:

    • 你能多指教吗?我对“在 println 之前调用方法 faktorial”感到困惑。从我的想法来看(这应该是我的逻辑有问题),'println' 将在评估所有内容后打印,而不是在评估 Thx 以获取您的响应时打印
    【解决方案3】:

    您的代码的行为是正确的:System.out.println 是一个函数,因此它会在执行之前评估其参数;对其参数的评估意味着faktorial内部的打印,因此从您的角度解释了打印的倒序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 2019-04-12
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多