[英]How does this recursive function get to this output?
當我為n = 5運行這段代碼時,我得到的輸出是“ 5 3 1 1 3 5”,我得到了5 3 1部分,但是在那之后n = -1,但是當我使用調試器運行代碼時,當n = -1轉到numbers(n-2);
之后的行numbers(n-2);
即System.out.prt(n+ "");
即使該語句包含在if塊中。
為什么會這樣?
public void numbers(int n)
{
if(n>0)
{
System.out.print(n+" ");
numbers(n-2);
System.out.print(n+" ");
}
}
TLDR:當n = -1時System.out.prt(n+ "");
即使它位於if塊中,該塊僅在n> 0時運行。
任何幫助將非常感激。 提前致謝!
刪除最終的System.out.print(n +“”); 遞歸數字調用后,它返回n的原始值並再次打印。
它從最深的級別冒泡回去,在最深的級別上它兩次打印1次,直到再次打出編號3的呼叫,再打出5個。
如果希望它在第一次打印后更新值,則必須通過執行n- = 2而不是n-2來更新變量n
對於n == 5
,這是幕后發生的事情:
numbers(5);
if(5 > 0)--> true :
System.out.print(5 + " "); // (1)
numbers(3);
| if(3 > 0)--> true :
| System.out.print(3 + " "); // (2)
| numbers(1);
| | if(1 > 0)--> true :
| | System.out.print(1 + " "); // (3)
| | numbers(-1);
| | System.out.print(1 + " "); // (4)
| System.out.print(3 + " "); // (5)
System.out.print(5 + " "); // (6)
注意每個數字應該如何打印兩次:
System.out.print(n + " "); // print once
numbers(n-2);
System.out.print(n + " "); // print twice
5 first system.out then number(5-2)
|
----> 3 first system.out then number(5-2)
|
----->1 first system.out then number(5-2)
(smaller than 0) , returning
|
1 second system.out
|
3<---- second system.out
|
5<--------- second system.out
在n = -1之后,遞歸調用將結束並返回到調用方方法以繼續。 找到的第一個命令是打印。
如果嘗試使用調試器進行調試,您將看到它的合理性。
Java將方法調用維護到堆棧中,並在輸出第一個5,3,1之后打印該方法調用,然后繼續執行其余調用,並從堆棧中打印1,3,5(首先拾取堆棧中的最后一個調用)。
遵循遞歸堆棧。
具有輸出流的堆棧表示:
------------------------->
5 3 1
num(5)--> num(3) --> num(1) --> num(-1) --> void
5 3 1
<-------------------------
現在,由於numbers(-1)不滿足if條件,因此程序控件來自if塊,並返回void。 現在開始彈出堆棧(遞歸):5 3 1 1 3 5.這就是您得到的輸出,並且可以預期。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.