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

时间:2018-11-10 14:10:44

标签: 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);
  }
}

4 个答案:

答案 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) != 0false而停止递归时,第一次调用第二个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。这就是它再次打印相同数字的原因。