今天上午上課時,再看了下hanoi塔的問題,其中對遞迴的分析,讓自己對遞迴呼叫有了更深一步地理解,把書上的**實現一下,然後分析其遞迴工作棧的狀態,理解了以後,會讓自己受益頗多。學習,不能只看著別人是怎麼寫的,自己就照著寫,這是非常不對的,你要分析別人為什麼這樣寫,你要懂得的是思路,而不僅僅是答案。
1 #include2執行結果:static
intc;
3void hanoi(int n,char x,char y,charz)4
14}15int
main()
16
分析:假設n=3,遞迴第一層的狀態為(返址:0,3,a,b,c)執行到第9行語句時,遞迴呼叫第二層(返址:6,2,a,c,b) 此時棧的狀態時在第一層之上,繼續遞迴呼叫又回到第9行語句,遞迴呼叫第三層(返址:6,1,a,b,c)此時棧的狀態時在第二層之上,繼續遞迴呼叫,這時n=1,所以會有第一步的輸出,a->c.輸出後,跳到第14行語句也就意味著遞迴的第三層函式呼叫結束,返回到遞迴呼叫的第二層(返址:6,2,a,c,b)繼續向下執行到第10行**,這是第二步輸出,a->b.
然後執行到第12行**,這是又遇到遞迴函式,前面還有兩層遞迴呼叫,所以這是遞迴呼叫第三層(返址:8,1,c,a,b),執行遞迴呼叫,此時n=1,所以第三步輸出,c->b,執行完後跳到14行**,以為著第二層函式呼叫結束,返回到第一層(返址:0,3,a,b,c),第一層的遞迴呼叫執行第10行**,就會用第四步輸出,a->c,繼續執行到第12行**,又遇到遞迴呼叫,此時狀態為遞迴呼叫第二層(返址:8,2,b,a,c),繼續執行,會到第9行**此時又遇到遞迴呼叫,遞迴呼叫第三層(6,1,b,c,a),繼續執行此遞迴呼叫,到第5行**,此時n=1所以輸出第五步:b->a.執行完後到第14行**,這是意味著第三層遞迴呼叫結束,回到第二層遞迴呼叫,接著執行第10行**,這是第六步輸出:b->c. 執行完後到12行**,又遇到遞迴呼叫(返址:8,1,a,b,c),遞迴呼叫執行到第5行**,滿足條件,輸出第七步:a->c。回到第二層遞迴呼叫,第二層遞迴呼叫又執行到第14行**,這意味遞迴呼叫結束,返回主函式。
找下規律,從執行的效果圖可以看出:
根據圓盤的數量確定柱子的排放順序:若n為偶數,按順時針方向依次擺放 a b c;看第2塊,從a->b,b->c
若n為奇數,按順時針方向依次擺放 a c b。看第一塊,a->c,c->b,b->a,a->c.第3塊:a->c
總結:自己分析得不怎麼好,當自己去想,自己去做時,會發現書上寫得有多好,自己寫的水平有多差了。hanoi塔問題,找到簡單的辦法解決看似複雜的問題。不過遞迴呼叫也不簡單,雖然只有那麼幾行**,可是分析起來是會死掉一些腦細胞的。。。嘻嘻。。。
遞迴 Hanoi塔問題
題目 hanoi塔問題,遊戲規則 1 每次只能移動乙隻圓盤 2 任何時候大圓盤不能壓在小圓盤之上 3 任何時候都不允許將圓盤放在三根立軸之外的任何地方。分析 遞迴的 base case 當只有乙個圓盤的時候,直接從圓盤所在的立軸移動到目標立軸,即完成。遞迴的 recursion rule 如圖所示,...
棧與遞迴的實現 Hanoi塔問題等等
函式中有直接或間接地呼叫自身函式的語句,這樣的函式稱為遞迴函式。遞迴函式用 得好,可簡化程式設計工作。但函式自己呼叫自己,有可能造成死迴圈。為了避免死迴圈,要 做到兩點 1 降階。遞迴函式雖然呼叫自身,但並不是簡單地重複。它的實參值每次是不一樣 的。一般逐漸減小,稱為降階。如教科書式 33 的ack...
hanoi塔問題(遞迴問題)
hanoi塔問題是比較經典的遞迴問題,很多學生從大一開始學習c語言遞迴時都或許會碰到這個問題,但很多同學一開始都是一知半解的,現在我來領大家一起重新學習一下hanoi問題,讓我們一起對遞迴函式有更好的理解。設n為hanoi塔的盤子的數量。a,b,c是三根支柱,hanoi 函式要求將所有的盤從a借助b...