2017-04-13 55 views
0

我明白遞歸時它只在自身上被調用一次,並且當有兩個時,我理解遞歸,因爲一個遞歸必須先完成或者在第二個可以開始之前完成。瞭解使用print語句的雙遞歸

我想了解河內的塔,但我真的不明白的是,當有兩個遞歸與打印語句時,讀取代碼行的順序。

有人可以簡單地分解訂單嗎?我創建了這個簡單的例子(其中test(3);)

爲什麼print語句運行?是不是立即調用它自己?

public static void test(int n){ 

    if(n>0){ 
     test(n-2);  
     test(n-1); 
     System.out.println("print " + n); 
    } 
} 
+3

「_我真的不明白是讀取代碼行的順序。是否有人可以簡單地分解順序?_」您可以使用調試器來查看執行時的流程。 – csmckelvey

+0

只有當所有中間方法調用都返回時,print語句纔會運行,因此中間方法調用將在當前調用之前打印並返回。 – Berger

+0

我不確定如何使用調試器來顯示打印語句。通過正常步驟運行它只顯示它讀取的行。 @berger,所以每次該方法調用自己它執行打印語句是這樣嗎? –

回答

0

您的代碼不是TOH的確切實現。

這裏是你的代碼的聲明(見它相信它)的遞歸樹和執行順序:

設N = 4

    4 

    /    \ 
     2     3 
/ \   /  \ 
0  1   1   2 
    / \ / \ / \ 
     -1  0 -1 0 0  1 
           / \ 
            -1 0 

test(4) 
test(2) 
test(0) 
test(1) 
test(-1) 
test(0) 
print(1) 
print(2) 
test(3) 
test(1) 
test(-1) 
test(0) 
print(1) 
test(2) 
test(0) 
test(1) 
test(-1) 
test(0) 
print(1) 
print(2) 
print(3) 
print(4) 

函數調用序列可以通過做一個預追查遍歷樹的順序。打印語句將針對節點值大於0的節點執行,並且在該節點的子節點都返回後執行。

+0

3而不是1在一個地方。 –

+0

編輯:所以它打印的順序是,它到達每個分支的末尾,然後返回樹?例如左分支= 1,2。右分支= 1右分支= 1234? –

+0

只需看一下樹並對其進行預先遍歷即可。打印語句是函數調用後循環內部的第三條語句。所以,在兩個函數調用將控件返回到當前函數後執行它。 – iavanish