1樓:
關於漢諾塔這個東西是相當的抽象,我當時學習的時候看了好幾個版本的教程,也沒有搞懂,最後還是自己反覆的理解,頓悟了,
所以我這裡把當時我作為初學者的想法寫給你,但是最重要的還得靠你自己的理解:
1、對於void hanoi(int n,char one ,char two,char three);這個函式,表示
將n個盤子從one通過two移動到three
我當時是這麼想的:先不管hanoi函式內部發什麼啥,只要這麼的執行一次,肯定的,就有n個盤子已經成功移動到three啦
2、理解了上面的含義後,我是這麼想的:
要將5個盤子從a移動到c(通過b),就得先從a將4個移動到b(通過c),一個從a到c,再從b移動4個到c(通過a),搞定
所以說hanoi(5, 'a' , 'b', 'c'); 裡面其實分為三步:
1)hanoi(4, 'a' , 'c', 'b');
2) printf("a->c");
3)hanoi(4, 'b' , 'a', 'c');
就是這樣的三步,至於1)這部嘛,反正我堅信:只要執行了這句函式,不管過程,最終a會移動到c4個的
3、然後是最後一點,對於hanoi這個函式,是指將將n個盤子從one通過two移動到three,所以函式內部這麼寫:
**和你給的略有不同,你的**將printf專門又用了一個函式來實現,原理是一樣的
可能是由於你真好學習到函式的相關,所以這個教程故意想弄得複雜點。。。
但是,這裡還應該有一個判斷語句,if(n==1),也就是隻有1塊需要移動,也就不需要這麼麻煩的三步了,直接移動就好了,所以最終的**: }
*********************************************
以上就是我的回答,希望對你有幫助
漢諾塔這東西主要需要的還是自己的反覆理解,想通了就簡單啦~
如果還有什麼疑問歡迎隨時向我追問^o^
2樓:匿名使用者
漢諾塔是一個遞迴呼叫問題,也就是自己呼叫自己,一直呼叫的n==1為止,然後才從n==1開始反向輸出。 首先你得理解這個問題(先看看斐波那契數列的遞迴計算比較有幫助)。 建議你畫圖表示一下低階遞迴結構,比較容易理解。
我給你語言描述下: 一個hanoi(n,one,two,three)函式可以理解為,有n個盤子在a上,現在要通過b把它們移到c上。 這個函式按以下步驟進行:
1. 把a上的n-1個盤子通過c移動到b上(hanoi(n-1,one,three,two)函式); 2. 把最底下的盤子從a移到c(move(one,three)函式)3.
把b上的n-1個盤子通過a移到c上(hanoi(n-1,two,one,three)函式) 然後知道遇到n==1的情況,開始輸出。
這樣你理解了吧,打的辛苦求好評,哈哈
c語言漢諾塔程式,C語言漢諾塔程式
將以下內容全部複製到新建的原始檔中 本人自己寫的,因為你那課本上的 沒解釋,書寫不規範,很難理解清楚,所以我直接新寫了一個完整的 附帶詳細說明 include 漢諾塔x層塔從a塔整體搬到c塔,中間臨時b塔。x層塔是從大到小往上疊放。每次移動只能移動一層塔。並且在移動過程中必須保證小層在上邊 藉助b塔...
c語言遊戲漢諾塔的執行過程,C語言遊戲漢諾塔的執行過程!
這樣寫我還沒有見過,感覺不怎麼樣,我見過一種寫法 偽 假設初始狀態從左到右依次是柱bac,盤子在a上 順序其實無所謂 目標從a到c,即右移 n是盤子個數目,1表示右移,如果到了已經在最右邊,直接迴圈到最左邊的 1表示與此正好相反 偽 void hanoi int n,int d d 1相當於把n 1...
漢諾塔問題的漢語詳細解釋,漢諾塔問題的漢語詳細解釋
漢諾塔問題 問題 首先去掉原來的神話色彩 神廟 僧侶和世界末日,來到問題的數學本質。有a b c三根柱子。a上堆放了n個盤子,每個盤子都比它下面的盤子小一些。現在要把盤子全部搬到c上去,條件是每次只能搬動一個盤子,而且任何時候都不能放在比它小的盤子上面 顯然,必須用到b作為中轉 怎麼搬動這些盤子呢?...