簡體   English   中英

Java方法執行最后一次打印語句三次,即使該方法僅被調用一次

[英]Java method executes last print statement three times even though the method is only called once

我試圖弄清楚為什么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);
  }
}

不知道我的答案是否會比以前的答案有用,但我會嘗試。 因此,基本上,您的程序使用兩種類型的遞歸:向后遞歸和正向遞歸。 我在這里的答案不是向您描述它們,而是為您提供了有關它們的更多信息的起點。

讓我們跟蹤程序的執行: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);

您的mystery()方法執行以下操作:

  • 打印輸入數字的最后一位( num %10給出最后一位)
  • 假設x / 10不為零,則進行遞歸調用mystery(x / 10)
  • 然后在遞歸的途中,再次打印輸入的最后一位

將其放在一起,輸入1234 ,這意味着我們將反向打印這些數字,然后按順序再次打印它們。

如果這個答案仍然讓您感到疑惑,建議您運行代碼,從兩位數字開始,例如12 ,直到清楚發生了什么。

我了解程序如何到達“ 43211”

所以你知道什么是遞歸。
每次調用mystery()都會調用第一個print ,然后在第二個print之前(遞歸)調用自身。
當由於(x / 10) != 0false導致遞歸停止時,第一次調用第二個print ,然后返回到先前未完成的遞歸調用,並為每個print執行剩余的print

這是您的遞歸堆棧。 很好

   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。 這就是它再次打印相同數字的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM