我试图弄清楚为什么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);
}
}
答案 0 :(得分:2)
不确定我的答案是否会比以前的答案有用,但我会尝试。因此,基本上,您的程序使用两种类型的递归:向后递归和正向递归。我在这里的答案不是向您描述它们,而是为您提供了有关它们的更多信息的起点。
让我们跟踪程序的执行:
mystery(1234)-> print(4)-> mystery(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);
答案 1 :(得分:1)
您的mystery()
方法执行以下操作:
num
%10表示最后一位)mystery(x / 10)
不为零,进行递归调用x / 10
使用1234
输入将它们放在一起,这意味着我们将反向打印这些数字,然后按顺序再次打印它们。
如果该答案仍然让您感到怀疑,建议您运行代码,从一个12
之类的两位数字开始,直到清楚发生了什么。
答案 2 :(得分:1)
我了解程序如何到达“ 43211”
所以您知道什么是递归。
每次调用mystery()
时,都会调用第一个print
,然后在第二个print
之前(递归)调用自身。
当由于(x / 10) != 0
为false
而停止递归时,第一次调用第二个print
,然后返回到以前的未完成递归调用并执行其余print
个。
答案 3 :(得分:0)
这是您的递归堆栈。很好
mystery(x / 10); input 1234 prints 4
-> mystery(x / 10); input 123 prints 3
-> mystery(x / 10); input 12 prints 2
-> mystery(x / 10); input 1 prints 1
只需确保删除代码中的第二个sysout。这就是它再次打印相同数字的原因。