1樓:匿名使用者
這是遞迴呼叫
h(3)呼叫h(2)+m()+h(2)
每乙個h(2)又呼叫h(1)+m()+h(1)
c語言--漢諾塔程式執行步驟
2樓:
這個問題你要先把遞迴搞懂才能理解的, 最好是單跟蹤執行一下, 我這裡就簡單說一下吧!
hanoi(5, 'a', 'b', 'c');把5個從'a'移到'c'
這時n=5, noe='a', two='b', three='c'
因為n!=1, 執行else裡的
hanoi( 4, 'a', 'c', 'b'); //把上面4個從a移到b
move( 'a', 'c'); //把第5個從a移到c
hanoi( 4, 'b', 'a', 'c'); //再把那4個從b移到c
上面的很好明白的, 再分析hanoi( 4, 'a', 'c', 'b'); //把上面4個從a移到b,也是執行else
hanoi( 3, 'a', 'b', 'c'); //把上面3個從a移到c
move( 'a', 'b'); //把第4個從a移到b
hanoi( 4, 'c', 'a', 'b'); //再把那3個從c移到b
一直到n=1才結束
3樓:匿名使用者
求真正理解漢諾塔問題的程式設計大神回答一下,當n=3時,用c語言編寫的漢諾塔遞迴呼叫**的詳細執行過程
4樓:汗會欣
/* 漢諾塔 hannota.c */
#include
/*解法:
如果柱子標為abc,要由a搬至c,在只有乙個盤子時,就將它直接搬至c,當有兩個盤子,就將b當作輔助柱。
如果盤數超過2個,將第三個以下的盤子遮起來,就很簡單了,每次處理兩個盤子,也就是:a->b、a->c、b->c這三個步驟,而被遮住的部份,其實就是進入程式的遞迴處理。
事實上,若有n個盤子,則移動完畢所需之次數為2^n-1;
所以當盤數為64時,則 64所需次數為:2^63=8446744073709551615為5.05390248594782e+16年,
也就是約5000世紀,如果對這數字沒什么概念,就假設每秒鐘搬乙個盤子好了,也要約5850億年左右
*/void hannota ( int n,char a,char b,char c )
else
}int main()
5樓:我愛上那女孩
一開始我接觸漢諾塔也是很不解,隨著**量的積累,現在很容易就看懂了,因此樓主主要還是對遞迴函式的理解不夠深刻,建議你多寫一些遞迴程式,熟練了自己就能理解。
圓盤邏輯移動過程+程式遞迴過程分析
hanoi塔問題, 演算法分析如下,設a上有n個盤子,為了便於理解我將n個盤子從上到下編號1-n,標記為盤子1,盤子2......盤子n。
如果n=1,則將「 圓盤1 」 從 a 直接移動到 c。
如果n=2,則:
(1)將a上的n-1(等於1)個圓盤移到b上,也就是把盤1移動到b上;
(2)再將a上 「盤2」 移到c上;
(3)最後將b上的n-1(等於1)個圓盤移到c上,也就是第(1)步中放在b上的盤1移動到c上。
注意:在這裡由於超過了1個盤子,因此不能直接把盤子從a移動到c上,要借助b,那 麼 hanoi(n,one,two,three)的含義就是由n個盤子,從one移動到three,如果n>2 那麼就進行遞迴,如果n=1,那麼就直接移動。
具體流程:
hanoi(2,a,b,c);由於2>1因此進入了遞迴的環節中。
<1>執行hanoi(1,a,c,b):這裡就是剛才的步驟(1),代表借助c柱子,將a柱子上的 1個圓盤(盤1)移動到b柱子,其實由於是n=1,此時c柱子並沒被用到,而是直接移動了。
<2>執行hanoi(1,a,b,c):這是步驟(2),借助b柱子,將a柱子上的乙個圓盤(盤2)移動到c柱子上。這裡由於也是n=1,也並沒有真正借助b柱子,直接移動的。
<3>執行hanoi(1,b,a,c):這是步驟(3),將b上的乙個盤子(盤1)移動到c
函式中由於每次呼叫hanoi的n值都是1,那麼都不會進入遞迴中,都是直接執行了mov移動函式。
如果n=3,則:(倒著想會想明白)移動的倒數第二部,必然是下面的情況
(1)將a上的n`-1(等於2)個圓盤移到c上,也就是將盤1、盤2 此時都在b柱子上,只有這樣才能移動最下面的盤子(盤3)。那麼由於現在我們先忽略的最大的盤子(盤3),那麼我們現在的目標就是,將兩個盤子(盤1、盤2)從a柱子上,借助c柱 子,移動到b柱子上來,這個過程是上面n=2的時候的移動過程,n=2的移動過程是「2 個盤子,從柱子a,借助柱子b,移動到柱子c」。現在是「2個盤子,從柱子a,借助柱子 c,移動到柱子b上」。
因此移動過程直接呼叫n=2的移動過程就能實現。
(2)將a上的乙個圓盤(盤3)移到c。
(3)到這一步,由於已經將最大的盤子(盤3)移動到了目的地,此時無論後面怎麼移動都不需要在用到最大的那個盤子(盤3),我們就先忽略他,剩下的目標就是將b上面的n-1個盤子(盤1、盤2)移動到c上,由於a上沒有盤子了,此時要完成上面的目標,就要借助a盤子。最終達到的目標就是將b上的2個盤子,借助a移動到c上,這個過程就是當n=2時分析的過程了,僅僅是最開始的柱子(b柱子)和被借助的柱子(a柱子)不同了。所以直接呼叫n=2時候的過程就能股實現了。
具體執行過程:
hanoi(3,a,b,c);由於3>1因此進入了遞迴的環節中。
<1>執行hanoi(2,a,c,b):這裡代表剛才的步驟(1),將兩個盤子(盤1、盤2)從a移動到b,中間借助c。根據n=2的分析過程,必然是能夠達到我們的目的。
<2>執行hanoi(1,a,b,c):現在a上只有乙個盤子(盤3),直接移動到c上面即可。
<3>執行hanoi(2,b,a,c):此時對應步驟(3),剩下的目標就是將b上的兩個盤子,借助a移動到c上。那麼同樣根據n=2的移動過程,必然能達到目的。
最終實現了3個盤子從a,借助b移動到了c。
6樓:匿名使用者
理解漢諾塔問題,可以先拋開遞迴這件事,就問題本身來討論,先不要看程式。
三個柱子上,小的圓盤一定在大的上面。把a柱上的盤子n號盤子移到b柱上,分成兩步,1)把n之前的移走,2)把n號盤移到b柱上,3)把n之前的盤子移回來。
先把這個問題本身搞清楚,再來討論程式實現。
把n之前的盤子移走這個事,不是簡單的一次就可以移走的,這是乙個過程。
這個過程要借助c柱,
移動n-1個盤子的過程,與移動n個盤子的過程相比,除了數量少乙個,目標是a到c,沒有本質的不同,這也是使用遞迴的基礎。
把解決問題的過程弄明白了,再來看程式就比較容易了。
n=3,移動3個盤子
實際上我們如果手工去做,要這樣,
1# a-b
2# a-c
1# b-c
3# a-b,這時3#已經就位。
1# c-a
2# c-b
1# a-b
這是移動3個盤子,從a-b。
要移動第4個盤子,這時就可以做了 4# a-c,然後重複前面的過程,把3個盤子移動到過來。
不過剛才移動的3個盤子是a-b,現在則是b-c,但基本的過程是一樣的。
具體 的程式看百科看吧。
關於c語言漢諾塔問題,當程式執行到001、002、003步時,不知道具體是個什麼步驟,求大神解惑!
用c語言編寫程式求漢諾塔的移動步驟
7樓:匿名使用者
#include
void move(char a,char b)void f(int n,char a,char b,char c)}void main()
這是我的** 前面的是定義乙個函式 這裡遞迴體現在函式裡面還有函式 於是會一次又一次的計算 直到最後把n-1以前的都移到b,最下面的移到c,再把其他的從b移到c。。 無返回的話 應該是這裡用void 沒有return返回數值
8樓:匿名使用者
#include
using namespace std;
int main()
c語言漢諾塔程式
9樓:券商論
將以下內容全部複製到新建的原始檔中:(本人自己寫的,因為你那課本上的**,沒解釋,書寫不規範,很難理解清楚,所以我直接新寫了乙個完整的**,附帶詳細說明)
#include
//漢諾塔x層塔從a塔整體搬到c塔,中間臨時b塔。
//x層塔是從大到小往上疊放。每次移動只能移動一層塔。並且在移動過程中必須保證小層在上邊
//借助b塔可以將x層塔全部從a搬到c上,並且符合要求(在移動過程中大的那塊在下邊,小的那塊在上邊)
int main()
//以下是tower函式的定義
//引數解析:x層塔放在a上,b是中間塔,c是目標塔。即x層塔要從a搬到c上。
//此函式實現x層塔從a整體轉移到c上。以及這個過程是怎麼搬的全部過程。
void tower(int x,char a,char b,char c)}
10樓:松思宸
只是乙個遞迴呼叫的典型例子。
函式move(char x, char y)表示把把x桿上的最上面的乙個盤子拿下來放到y桿上。
函式void hanoi( int n, char one, char two, char three ) 的作用是把位於one杆的所有n個盤子借助two杆移動到three桿上。
玩漢諾塔做法是,假設初始時1號杆上有n個盤子,盤子是頂上的盤子小越往下越大,這時候如果要把所有n個盤子從1號杆挪到3號杆的話,需要先把1號杆上上面的n-1個盤子放到2號杆上,然後把1號杆最底下那個最大的盤子放到3號杆上,這時候第一大步就完成了。下一步就是把2號杆上最低下那個最大的盤子借助1號杆移動到3號杆上。總之就是一大步把其餘桿上最大的乙個盤子放到3號杆上。
當最後剩下乙個盤子沒有移動到3號杆的時候,只需要將這個盤子直接從其他杆拿到3號杆即可了。void hanoi( int n, char one, char two, char three ) 完成的就是上述的步驟嘍。
11樓:曹越
先看hanoi(漢諾塔)函式
如果n=1的情況下呼叫move函式,但剛開始n不可能等於1,所以選用else操作。
hanoi( n - 1, one , three, two ); 這裡的意思是:盤子的總數等於n,所以先把n-1個盤子,通過第三個柱子挪到第二個柱子上。學過計算機的人知道,要想實現兩數之間的交換,就必須借用第三個數,所以這裡為了把n-1個盤子挪到第二個柱子上,就必須借用第三個柱子。
然後呼叫move函式。move(one,three ); printf( "%c ---> %c\n", x, y );呼叫move函式之後,move函式的功能是把最後乙個盤子挪到第三個柱子上,hanoi( n - 1, two, one, three ); 意思是當最後乙個盤子已經挪到第三個柱子上之後,在把第二個柱子上的n-1個盤子通過第乙個柱子挪到第三個柱子上。
這個演算法的整體意思是在n=1的情況下,直接把盤子挪到第三個柱子上,在n>1的情況下,先把n-1個盤子挪到第二個柱子上,把最後乙個盤子挪到第三個柱子上之後,再把在第二個柱子上的n-1個盤子通過第乙個柱子挪到第三個柱子上。
move函式裡的printf語句應該是為了顯示盤子的呼叫過程。
漢諾塔的演算法,漢諾塔的演算法
演算法介紹 當盤子的個數為n時,移動的次數應等於2 n 1。後來一位美國學者發現一種出人意料的簡單方法,只要輪流進行兩步操作就可以了。首先把三根柱子按順序排成品字型,把所有的圓盤按從大到小的順序放在柱子a上,根據圓盤的數量確定柱子的排放順序 若n為偶數,按順時針方向依次擺放a b c 若n為奇數,按...
5層漢諾塔遊戲31步怎麼移到另柱子上
5層漢諾塔遊戲弄好四層後,先把上面的四個借助第三根柱子移到第二根柱子上,再把剩下的乙個移到第三根柱子上,最後借助第一根柱子將第二根柱子上的移到第三根柱子上去。漢諾塔,又稱河內塔,是一款wp7平台上源於印度乙個古老傳說的益智類遊戲。漢諾塔 傳說上帝創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上...
c語言的題,求大神解答,C語言題,求大神解答
解 1 a項錯誤 有些不可見字元可放入緩衝區,例如 回車 空格。b項錯誤 有些輸入函式有緩衝區,有些沒有,例如 getchar 有緩衝區,getch 無緩衝區,getche 無緩衝區。c項錯誤 緩衝區不需要定義。所以選d。2 getchar 函式有緩衝區。getchar函式的返回值是使用者輸入的字元...