資料結構(嚴蔚敏版)p65 hanoi塔問題的實現
通過該程式的運算結果,深刻理解遞迴的呼叫和返回過程
#includeusing namespace std;
int c = 0;
void move(char x,int n, char z)
void hanoi(int n, char a, char b, char c)//將塔座a上的n個圓盤按規則搬到c上,b為過渡
}void main()
執行結果
hanoi塔問題演算法最重要的思想就是「分而治之」,一共n個圓盤,將前n-1個圓盤看做乙個整體,
將a上n-1個圓盤移到b(hanoi(n - 1, a, c, b)),
將第n個圓盤從a移到c(move(a, n, c)),
將b上n-1個圓盤移到c(hanoi(n - 1, b, a, c))。
利用遞迴呼叫樹更容易理解**執行過程
筆記
看遞迴呼叫樹,比較容易理解**執行過程,
但原來直接看**時,一直想不通**對應的遞迴呼叫樹中第2層到第3層的過程,後來發現自己搞錯了 實參與形參之間的值傳遞,一定要搞清楚形參中的a,b,c對應實參中的a,b,c的順序,並不一定是a對應a,b對應b,c對應c。
hanoi塔問題的遞迴實現
一 背景故事 二 問題描述 假設有x,y,z三座塔座。在塔座x上有n個直徑各不相同 依次從小到大的編號為1,2.n的圓盤。現要求將x座上的盤子移動到z上,移動要求如下 1 一次只能移動乙個盤子。2 盤子只能插在x,y,z的某個塔座上。3 任何時刻不能將較大的盤子壓在較小的盤子上。如何移動盤子呢?當只...
遞迴實現hanoi塔問題演算法
三個塔座,x y z x上有n個直徑大小各不相同從大到小依次編號為n的圓盤,將x塔上的圓盤移到z塔,要求 每次只能移動乙個圓盤 任何時候不能將較大的圓盤壓在較小的圓盤之上 演算法分析 如果x塔上只有乙個圓盤,則直接移到z軸上即可 如果x塔上圓盤個數 1,先將x塔上的n 1個盤借助z塔依次挪到y塔上,...
棧與遞迴的實現 Hanoi塔問題等等
函式中有直接或間接地呼叫自身函式的語句,這樣的函式稱為遞迴函式。遞迴函式用 得好,可簡化程式設計工作。但函式自己呼叫自己,有可能造成死迴圈。為了避免死迴圈,要 做到兩點 1 降階。遞迴函式雖然呼叫自身,但並不是簡單地重複。它的實參值每次是不一樣 的。一般逐漸減小,稱為降階。如教科書式 33 的ack...