打印阶乘递归方法时 Java 中的错误? 'printing command' 之前打印的输出
Bug in Java when printing factorial recursive method? Output printed before 'printing command'
我目前正在学习 java 并且正在学习递归。我尝试了这两种相同的方法,但我认为其中一种方法很奇怪。这是 Java 中的错误吗?还是只有我不懂逻辑
谁能解释一下?
JAVA 我使用:
java版本“1.8.0_261”
Java(TM) SE 运行时环境(build 1.8.0_261-b12)
Java HotSpot(TM) 客户端 VM(构建 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 <== 这里有些奇怪,它应该在 'Factorial 5 = ' 之后打印,而不是在
之前打印
阶乘 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
在您的这一行代码中(来自案例 1):
System.out.println("Factorial " + value + " = " + faktorial(value));
方法 faktorial
在 println
.
之前 被调用
这就是 faktorial
的输出首先出现的原因。
我建议你 运行 你的代码带有调试器(每个好的 IDE 都有一个)然后你自己看看。
行中调用函数faktorial
,
System.out.println("Factorial " + value + " = " + faktorial(value));
虽然函数是运行它会打印你写的所有打印语句,然后当你得到函数faktorial
的return值时,那么行"Factorial " + value + " = " + faktorial(value)
将被打印出来。
第二个例子也有类似的情况,先打印函数的打印语句,在函数returns之后,你会得到打印函数的return值。
您的代码的行为是正确的:System.out.println
是一个函数,因此它在执行之前评估其参数;对其参数的评估意味着在 faktorial
内打印,因此从您的角度解释了打印的倒序。
我目前正在学习 java 并且正在学习递归。我尝试了这两种相同的方法,但我认为其中一种方法很奇怪。这是 Java 中的错误吗?还是只有我不懂逻辑
谁能解释一下?
JAVA 我使用:
java版本“1.8.0_261”
Java(TM) SE 运行时环境(build 1.8.0_261-b12)
Java HotSpot(TM) 客户端 VM(构建 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 <== 这里有些奇怪,它应该在 'Factorial 5 = ' 之后打印,而不是在
之前打印阶乘 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
在您的这一行代码中(来自案例 1):
System.out.println("Factorial " + value + " = " + faktorial(value));
方法 faktorial
在 println
.
之前 被调用
这就是 faktorial
的输出首先出现的原因。
我建议你 运行 你的代码带有调试器(每个好的 IDE 都有一个)然后你自己看看。
行中调用函数faktorial
,
System.out.println("Factorial " + value + " = " + faktorial(value));
虽然函数是运行它会打印你写的所有打印语句,然后当你得到函数faktorial
的return值时,那么行"Factorial " + value + " = " + faktorial(value)
将被打印出来。
第二个例子也有类似的情况,先打印函数的打印语句,在函数returns之后,你会得到打印函数的return值。
您的代码的行为是正确的:System.out.println
是一个函数,因此它在执行之前评估其参数;对其参数的评估意味着在 faktorial
内打印,因此从您的角度解释了打印的倒序。