簡體   English   中英

此遞歸函數如何到達此輸出?

[英]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.

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