[英]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) != 0
為false
導致遞歸停止時,第一次調用第二個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.