2014-09-04 42 views
2

我是一名剛剛學習數據結構的計算機工程專業的學生。今天的演講將遞歸函數作爲解決因式問題或排序問題的簡單方法。我的教授使用了河內的Towers例子,我真的很想確定我理解遞歸函數被調用的順序。我試着一步一步地寫出函數如何執行,但我沒有得到正確的序列。C++ - 不理解遞歸函數的流程

我將在下面發佈我的源代碼,它非常簡單。如果有人能幫我解釋,我會非常感激。謝謝!

void hanoi(int N, char S, char D, char I){ 
    //Step1: Anchor Value or Base Case 
    if(N==1){ 
     cout <<"Move " << N << " from " << S << " to " << D << endl; 
    } 
    else { 
     //Step2: Make progress towards base case 
     hanoi(N-1, S, I, D); 
     cout << "Move " << N << " from " << S << " to " << D << endl; 
     hanoi (N-1, I, D, S); 
    } 
} 

int main(){ 
    int N; //Number of disks 
    cout << "Enter number of discs: " << endl; 
    cin >> N; 
    char S = 'S'; //Source 
    char D = 'D'; //Destination 
    char I = 'I'; //Intermediary 

    hanoi(N, S, D, I); 

    system("pause"); 
} 
+0

你不明白什麼? – 2014-09-04 18:29:42

+0

我試圖從邏輯上理解遞歸函數如何流動。我使用N = 3作爲我的輸入,並且每次執行河內函數時都要跟蹤。 – 2014-09-04 18:41:12

+0

[添加信息,請澄清你的問題。](http://stackoverflow.com/posts/25672631/edit) – 2014-09-04 18:49:28

回答

2

與3個磁盤執行的實施例:

hanoi(3, 'S', 'D', 'I') 
    (else) 
    hanoi(2, 'S', 'I', 'D') 
     (else) 
     hanoi(1, 'S', 'D', 'I') 
      (cout) move 1 from 'S' to 'D' 
     (cout) move 2 from 'S' to 'I' 
     hanoi(1, 'D', 'I', 'S' 
      (cout) move 1 from 'D' to 'I' 
    (cout) move 3 from 'S' to 'D' 
    hanoi(2, 'I', 'D', 'S') 
     (else) 
     hanoi(1, 'I', 'S', 'D') 
      (cout) move 1 from 'I' to 'S' 
     (cout) move 2 from 'I' to 'D' 
     hanoi(1, 'S', 'D', 'I') 
      (cout) move 1 from 'S' to 'D' 

爲了理解字幕,考慮 'S' 是左, 'd' 是中間和 'I' 是剩下。 1是較小的磁盤,2是中等磁盤,3是較大的磁盤。