深入理解遞迴演算法

2021-09-30 12:56:11 字數 2289 閱讀 4476

下面是對遞迴演算法執行過程的理解:(結合漢諾塔問題)

【原始碼】

public class hanoi

else

}public static void main(string args)

}為了方便我等下解釋執行過程,也把**的截圖貼在下面:

準備工作做完了,正式開始理解過程的講解:(以漢諾塔三個圓盤時為例,這裡n=3)

1、程式從主函式開始執行,呼叫move(3,『a』,『b』,『c』),然後從第5行進入mov方法。

2、進入move方法後,此時n=3,所以判斷之後到達第13行,呼叫move(2,'a','c','b')。此時產生了第1個斷點,產生斷點的原因是程式本應該順序往下執行,但是由於呼叫了move(2,'a','c','b')方法,導致程式不能繼續順序往下執行,而是回到第5行,重新執行move方法,所以此時產生了第1個斷點,記為「斷點1」。產生斷點時,系統需要將此時的狀態資訊儲存在棧中,此時棧的狀態如【圖1】。

3、由於呼叫move(2,'a','c','b'),程式重新回到第5行開始往下執行,此時n=2,判斷之後到達第13行,呼叫move(1,'a','b','c'),同理此時產生乙個斷點,記為『斷點2』,系統將此時的狀態資訊壓入棧中。此時棧的狀態如【圖2】。

4、由於呼叫move(1,'a','b','c'),程式重新回到第5行開始執行,此時n=1,判斷之後達到第9行,此時a='a',c='c',所以輸出【a->c】。此時move(1,'a','b','c')執行結束,退出該方法,彈出棧頂的資訊作為當前系統的狀態資訊(彈出的資訊為:n=2   a=『a』  b=『c』   c=『b),彈棧後棧的狀態如【圖3】,回到斷點2處(第14行)開始執行,輸出【a->b】。呼叫move(1,『c』,'a','b')。

5.由於呼叫move(1,『c』,'a','b'),程式重新回到第5行開始往下執行,此時n=1,判斷之後到達第9行,此時a='c',c='b',所以輸出【c->b】。此時move(1,『c』,'a','b')執行結束,退出該方法,彈出棧頂的資訊作為當前系統的狀態資訊(彈出的資訊為:n=3   a=『a』  b=『b』   c=『c

』),彈棧後棧的狀態如【圖4】,回到斷點1處(第14行)開始執行,輸出【a->c】。呼叫move(n=2,'b','a','c')。

6、由於呼叫move(n=2,'b','a','c'),程式重新回到第5行開始執行,此時n=2,判斷後到達第13行,呼叫move(n=1,'b','c','a'),同時產生乙個斷點。記為「斷點3」,系統將此時的狀態資訊壓入棧中。此時棧的狀態如【圖5】。

7、由於呼叫move(n=1,'b','c','a'),程式重新回到第5行開始往下執行, 此時n=1,判斷之後到達第9行,此時a='b',c='a',所以輸出【b->a】。此時move(n=1,'b','c','a')執行結束,退出該方法,彈出棧頂資訊作為當前系統的狀態資訊(彈出的資訊為:n=2   a=『b』  b=『a』   c=『c

』),彈棧後棧的狀態如【圖6】,回到斷點3處(第14行)開始執行,輸出【b->c】。呼叫move(n=1,'a','b','c')。

8、用於呼叫move(n=1,'a','b','c'),程式重新回到第5行開始執行,此時n=1,判斷後到達第9行,此時a='a',b='b',所以輸出【a->c】。此時move(n=1,'a','b','c')執行結束,【且棧為空】,程式執行結束。

*************************************

這裡推薦一篇類似的文章,如果你看完我寫的還沒有理解遞迴的話,可能是我寫的不夠好,說的不夠清晰明了,也許你可以看看或許對你會有幫助。

*********************************************

深入理解遞迴

以此類推是遞迴的基本思想。具體來講就是把規模大的問題轉化為規模小的相似的子問題來解決。在函式實現時,因為解決大問題的方法和解決小問題的方法往往是同乙個方法,所以就產生了函式呼叫它自身的情況。另外這個解決問題的函式必須有明顯的結束條件,這樣就不會產生無限遞迴的情況了。遞迴的兩個條件 遞迴演算法的一般形...

深入理解遞迴

以此類推是遞迴的基本思想。具體來講就是把規模大的問題轉化為規模小的相似的子問題來解決。在函式實現時,因為解決大問題的方法和解決小問題的方法往往是同乙個方法,所以就產生了函式呼叫它自身的情況。另外這個解決問題的函式必須有明顯的結束條件,這樣就不會產生無限遞迴的情況了。遞迴的兩個條件 1 可以通過遞迴呼...

深入理解遞迴

遞迴例子 includevoid up and down int int main void void up and down int n level 1 1 location 0022ff10 level 2 1 location 0022fef0 level 3 1 location 0022f...