hanoi塔裡面不懂的地方。望解答

時間 2022-04-26 16:35:11

1樓:

if(n==1) ①

move(one,three);

else

hanoi(n-1,one,three,two); ②

move(one,three); ③

hanoi(n-1,two,one,three); ④ //你的程式這裡似乎是寫錯的。

給你畫了個圖看遞迴執行的過程。雖然還是不抱太大希望能講明白……

遞迴跟數學上的數學歸納法類似。

n=1的時候,hanoi(1,a,b,c)能成功將一個盤子從a經過b移到c.

假設n-1時,hanoi(n-1,a,b,c)能成功將n-1個盤子從a經過b移到c.

那麼,n時,hanoi(n,a,b,c)首先呼叫hanoi(n-1,a,b,c),

將上面n-1個盤子從a經過c移到b上(這一點在假設裡已經滿足)

也就是hanoi(n-1,one,three,two); ②;

然後將最下面一個盤子從a移到c,也就是move(one,three); ③

最後將剛才那n-1個盤子從b經過a移到c上,

也就是hanoi(n-1,two,one,three); ④,

這一點也是假設條件,也能成功。

所以得證,n為任意整數時,呼叫hanoi(n,a,b,c)就可以把n個盤子從a經過b運到c上去。

你要跟著程式把整個移動3個盤子的過程跟蹤一遍就好懂了。如果還是不行,就找個身邊的懂的人講講。

祝你成功~畢竟遞迴還是程式設計中很重要的一個部分。

2樓:匿名使用者

這是一個遞迴的經典演算法,就是從結果倒推過程

3樓:匿名使用者

樓主還沒有學過遞迴函式吧,遞迴函式就是在函式內部呼叫自身,層層巢狀.

else裡的hanoi(n-1,one,three,two); 就是對自身的一個呼叫.直到最後一層呼叫執行完畢,再層層返回.

我想初學者都會有樓主這樣的疑問,既然在這裡都遞迴了,hanoi(n-1,one,three,two); 後面的語句都是幹什麼用的?

其實可以這麼理解,當你呼叫一次這個函式的時候,那麼就表明這個函式內的所有語句要全部執行到.看這裡,當n最後等於1的時候可以執行move了,正好,n=1的時候,執行了if裡的內容,不能執行else裡的內容,那麼這個函式就執行完了.這裡要注意:

當函式執行完的時候要返回它先前被呼叫的位置繼續執行. 那麼n=1的時候返回**呢?答案是:

返回到hanoi(n-1,one,three,two); 這句.(這時n=2,才滿足最後n=1執行完函式的條件.)然後不就可以繼續執行這下面的語句了嗎?

move(one,three);

hanoi(n-1,one,three,two);

這裡,繼續剛才上面一樣的操作,知道n=1執行完最內層的函式為止,再層層返回

看懂了遞迴的方法,演算法分析起來就很容易了

c語言裡面hanoi塔的一個問題

4樓:匿名使用者

c程式設計(譚浩強)和資料結構中都涉及函式的遞迴呼叫。資料結構的重要性是不可言喻的。因此該程式的思想要掌握。

一般不好解決的問題我們可以把抽象問題的具體化。比如取n=3。按照你上面的程式:

n=3時執行 hanoi(2,a,c,b)。當執行它時,它會呼叫函式 void hanoi(int n,char a,char b,char c);也就是自己呼叫自己本身,而n==2(n!=1)執行注意這裡是 hanoi(1,a,b,c);move(a,b); hanoi(1,c,a,b);繼續執行,繼續呼叫本身,此時n=1,則執行注意這裡是 move(a,c); move(a,b);move(c,b);上面所述才只執行了hanoi(2,a,c,b);後面還有move(a,c); hanoi(2,b,a,c);執行move(a,c);後再繼續執行 hanoi(2,b,a,c);照上述分析,n=2時呼叫自己,執行hanoi(1,b,c,a);move(b,c);hanoi(1,a,b,c);此時n=1,執行move(b,a); move(b,c); move(a,c);

全部執行下來就是 a-c,a-b,c-b,a-c,b-a,b-c,a-c;。n不是具體值時,你上面也寫了該程式的思想,我估計你沒弄懂遞迴的思想,漢諾塔問題是不斷呼叫自己的遞迴思想,要仔細體會。其實不難,你去把譚浩強的書那一節仔細仔細細的看。

好書是要一個一個字看的,如同高數裡面的定理,那裡面的定理裡面的字是一個不多一個不少,多一個或者少一個定理都不成立。從你提出問題你沒理解函式呼叫的問題,當n!=1時程式執行到第七步,即是這個函式呼叫 hanoi(n-1,a,c,b);此時它會進行值傳遞,傳遞給誰?

也就是自己本身這個函式void hanoi(int n,char a,char b,char c),這樣不斷呼叫自己,直至n=1。然後執行第八個;最後執行第九個

hanoi(n-1,b,a,c);同理也是不斷呼叫自己。最後程式結束。希望對你有幫助!

5樓:帥聰虎偉兆

這個符號在c語言裡是沒有的,應該是c++中的符號,用在定義函式的時候,在函式名前面加類名和「::」,格式如下:類名::函式名,意思是該函式是屬於這個類的。

6樓:匿名使用者

遞迴是一個比較繁瑣的問題。這個是棧的原理。

hanoi塔問題的c語言解法及解析

7樓:匿名使用者

#includeint count=0;void move(char x,int n,char z);void hanoi(int n ,char x,char y,char z)}void move(char x,int n,char z)void main()

新人回答,希望採納!

hanoi塔問題

8樓:1983老虎

可以參考下那邊的帖子,把漢諾塔解釋得很清楚了雖然這個的寫法有些不同,但原理使一樣的

千字的回覆,看了肯定明白

9樓:蟲蟲鬆

編碼規則裡 建議不使用遞迴函式的!

10樓:匿名使用者

譚老師的己經很詳細了吧?

這也就是函式遞迴的運用。

11樓:爨室

move(int n,int x,int y,int z) }

main()

可能就是這麼理解的吧

12樓:匿名使用者

這麼好理解的東西`~~

c++hanoi塔問題怎麼做

13樓:離離原上花開

void hannoi(int n,char a,char b,char c)

#include

//use namespace std;

//num:個數 src:源 dst:目的地 tmp: 臨時位置

void hano(unsigned int num,char src,char dst,char tmp);

int main(void)

void hano(unsigned int num,char src,char dst,char tmp)}

這是用c語言編寫的hanoi塔問題,請問怎樣解讀**呢?

14樓:小刺蝟

move裡是一個遞迴呼叫 你可以仔細研究下遞迴的問題。主要注意看下 :遞迴結束的邊界條件

那首歌的歌詞裡面有你還是不懂你還是不懂分

他還是不懂 she要說什麼 杯子都已經空了 閉上眼睛心裡下起大雪 天寒又地凍 是不是到了 愛情結帳的時候 只剩下各自買單的寂寞 為什麼當我推開門 他沒有來拉住我 他還不懂 還是不懂 離開是想要被挽留 如果開口那只是我要來的溫柔 他還不懂 永遠不懂 一個擁抱能代替所有 愛絕對能夠動搖我 要用什麼 融化...

龍塔有什麼值得一去的地方呢,龍塔有什麼好玩的

你是說什麼地方的龍塔,是哈爾濱的龍塔麼?如果不是,請說的詳細一些。哈爾濱龍塔,即黑龍江省廣播電視塔,亞洲第一鋼塔,坐落於黑龍江省哈爾濱市經濟技術開發區,高336米,在1998年動工興建,於2000年對外開放,是集廣播電視發射 旅遊觀光 餐飲娛樂 廣告傳播 無線通訊 環境氣象監測等多功能於一體的綜合性...

哈利波特迷請進,有不懂的地方請教啊

1.意思就是,在伏地魔朝哈利念出死咒之後,哈利的思想 應該是思想,因為沒穿衣服 進入到另一個世界,與鄧布利多談話 2.這就好像畫像一樣 校長辦公室的那些 我感覺那是 死者 老鄧不是說了嗎,不要憐憫死者,而要關心生者 不過其實我倒覺得那是伏地魔 he took your blood and rebui...