遞迴演算法!梵塔問題!C語言 遞迴 梵塔問題

2025-04-23 07:31:27 字數 5200 閱讀 3320

1樓:匿名使用者

procedure move(n,a,b,c:integer);/該函式就配鎮是將a柱上n個盤子通過b柱移動到c柱上。

beginif n=1 then writeln(a,'-c) /如果a柱上只剩乙個盤子 , 就直接移動到c

elsebegin

move(n-1,a,c,b); 先將a柱上的n-1個盤子通過c柱移動到b柱去。

writeln(a,'-c); 明差/ 將a上的最後乙個盤子移動到c柱上。

move(n-1,b,a,c) /再將b柱上的n-1個盤子通過a柱移動到c柱上。

end;end;

beginwrite('the number of dish:')

readln(number);

move(number,1,2,3);

readln

end.如果你還是沒有懂的話 可能是遞迴呼叫的激賣皮過程沒理解到 自己想想吧 不要過分糾結於它是如何遞迴的。

c語言 遞迴 梵塔問題

2樓:_橘子枝

move(n,a,b,c);是把a上面的n個盤子移到c上。當a上面有1個盤子時直接移到c上,n>1時,先把上面的n-1移到b上,此時a上還有1個,它就直接輸出了把a上面的移到c上,然後再b上的n-1個移到c上。

或許這樣寫好理解些。

int move(int n,char a,char b,char c)

其實實質一樣,它就是把move(1,a,b,c);換成了直接輸出,還相當於把剩下的乙個移到c上。

3樓:網友

這是漢羅塔問題,其中的'n'表示的是盤子的個數。move(n,a,b,c)中的n即表示現在需要搬動的盤子數,'a'位置的引數(即move()函式中的第二個參數列示要移出盤子的"柱子"的編號),同理'c'位置的引數(即move()函式中的第四個參數列示要移入盤子的"柱子"的編號).

如:mov(n,b,a,c)就是要將'b'柱子中的第乙個盤子移動到'c'柱子上去。

證明hanoi塔問題的遞迴演算法與非遞迴演算法實際上是一回事

4樓:網友

奇妙的問題。

實際上你需要形式化的描述這兩種演算法,才有可能證明他們是等價的吧我比較好奇,有沒有例子,證明其他某種演算法的遞迴與非遞迴的等價性,很好奇這種東西是怎麼證明的。

另外,參考資料裡面的那只是你同學麼。

5樓:匿名使用者

證明:設解決漢諾塔問題的函式為hanoi(n,a,b,c)

用數學歸納法即可證明上述問題。

當n=1和n=2時容易直接驗證。設當k<=n-1時,遞迴演算法和非遞迴演算法產生完全相同的移動序列。考察k=n時的情形。

將移動分為順時針移動(s),逆時針移動(n)和非最小圓盤塔間的移動(f)三種情況。

1)當n為奇數時,順時針非遞迴產生的移動序列為s,f,s,f,··s,逆時針非遞迴演算法產生的序列為n,f,n,f,··n。

當n為偶數時,順時針非遞迴產生的移動序列為n,f,n,f,··n,逆時針非遞迴演算法產生的序列為s,f,s,f,··s。

2)當n為奇數時,順時針遞迴演算法hanoi(n,a,b,c)產生的移動序列為。

hanoi(n-1,a,c,b)產生的移動序列,f,hanoi(n-1,c,b,a)產生的移動序列。

其中,hanoi(n-1,a,c,b)hanoi(n-1,c,b,a)均為偶數圓盤逆時針移動問題。由數學歸納法知,它們產生的移動序列均為s,f,s,f,··s。因此hanoi(n,a,b,c)產生的移動序列為s,f,s,f,··s。

當n為偶數時,順時針遞迴演算法hanoi(n,a,b,c)產生的移動序列為。

hanoi(n-1,a,c,b)產生的移動序列,f,hanoi(n-1,c,b,a)產生的移動序列。

其中,hanoi(n-1,a,c,b)hanoi(n-1,c,b,a)均為奇數數圓盤逆時針移動問題。由數學歸納法知,它們產生的移動序列均為n,f,n,f,··n。因此hanoi(n,a,b,c)產生的移動序列為n,f,n,f,··n。

當n為奇數和偶數時的逆時針遞迴演算法也類似。

由數學歸納法可知,遞迴演算法和非遞迴演算法產生相同的移動序列。

遞迴演算法的引數傳遞問題

6樓:網友

hanoi(3,a,c,b)就是原來的,hanoi(2,a,c,b)中a='a',c='b',b=『c'。

因為hanoi(4,a,b,c)函式執行時,即hanoi(4,'a','b','c').先執行hanoi(3,a,c,b)。這裡a、b、c值沒變,而執行前面的hanoi(3,a,c,b)時裡面的,函式里面的引數a、b、c已經不是原函式的a、b、c。

可以把他們看做是新申請的變數並賦值了。

7樓:網友

如果遞迴到hanoi(3,a,c,b) a,b,c 分別對應a,c,b

如果遞迴到hanoi(2,a,c,b)那 a,b,c分別對應a,b,c的值。

沒什麼原因,只是實參傳遞問題而已。

怎樣解決「梵塔」問題?

8樓:匿名使用者

1.設金片只有一片。顯然,只要移動1次即可。

2.設金片只有二片。可先將較小金片移至乙針上,較大金片移至丙針上,再將較小金片從乙針移至丙針上,共移動3次。

3.設金片有三片。可先將上面兩片金片移到乙上。按2可知,共需移動3次。再把第三片移至丙,又移一次。下面把乙上兩片移至丙同2,還需三次。以上共需。

2·3+1=7(次)。

4.設金片有四片。先把上面三片移至乙,按3需7次。再把第四片從甲移到丙上,又移一次。最後,把較小的三片從乙移至丙,又需移7次。以上共需移動。

2·7+1=15(次)。

依此遞推下去。設有k片金片,先將k-1片移至乙,需移動sk-1次。然後再把第k片移至丙,又移一次。最後把k-1片從丙移至乙,又需sk-1次。以上共需移動。

2·sk-1+1)次。

這樣,我們可以得到如下的遞推式:

sk=2·sk-1+1。

根據這個遞推公式,分別令k=1,2,3,……64,得。

s1=1=21-1;

s2=2s1+1=2(21-1)+1=22-1;

s3=2s2+1=2(22-1)+1=23-1;

s4=2s3+1=2(23-1)+1=24-1;

s64=264-1=18446744073709551615。

如果僧侶移動金片一次需要1秒鐘,移動這麼多次共需約5845億年。把這個寓言和現代科學推測對比一下倒是有意思的。按照現代的宇宙演化論,恆星、太陽、行星(包括地球)是在三十億年前由不定形物質形成的。

我們還知道,給恆星特別是給太陽提供能量的「原子燃料」還能維持100~150億年。因此,我們太陽系的整個壽命無疑要短於二百億年。可見遠不等僧侶們完成任務,地球早已毀滅了。

呵呵,很難理解吧!

9樓:匿名使用者

【梵塔】也稱漢內塔,漢諾塔,河內塔。問題是印度的乙個古老的傳說。開天闢地的神勃拉瑪在乙個廟裡留下了三根金剛石的棒,第一根上面套著64個圓的金片,最大的乙個在底下,其餘乙個比乙個小,依次疊上去,廟裡的眾僧不倦地把它們乙個個地從這根棒搬到另一根棒上,規定可利用中間的一根棒作為幫助,但每次只能搬乙個,而且大的不能放在小的上面。

解答結果恰如上題,面對龐大的數字(移動圓片的次數)18446744073709551615,看來,眾僧們耗盡畢生精力也不可能完成金片的移動。

後來,這個傳說就演變為漢諾塔遊戲:

1.有三根杆子a,b,杆上有若干碟子。

2.每次移動一塊碟子,小的只能疊在大的上面3.把所有碟子從a杆全部移到c杆上。

10樓:匿名使用者

和他們的差不多達,伱就看這辦嘛。

漢諾塔遞迴問題

11樓:網友

#include

#include

using namespace std;

ofstream fout("");

void move(int n,char x,char y)

fout<<"把"<1進入else,按順序執行,先執行hannoi(n-1,a,c,b);然後又是呼叫本身,注意傳入的值,是a(2),c(2),b(2),又轉入去執行hannoi(int n,char a,char b,char c)函式,這時接收的值a(3)=a(2),b(3)=c(2),c(3)=b(2),就像在兜圈子是吧,沒錯。後面你自己做張表來理一下。

這樣兜圈子直到n=1。你看hannoi(n-1,a,c,b);每次n都是減了1的,所以n-1次遞迴的時候,就直接執行if(n==1)裡面的了,終於有所改變了是吧,他執行的是move(1,a,c); 也就是輸出函式,執行完move(int n,char x,char y) 返回原來的呼叫的那個斷點。繼續向後。

沒有語句了,就返回上次呼叫的函式,上次呼叫hannoi(int n,char a,char b,char c)是誰呢,就是n-2次的hannoi(int n,char a,char b,char c)中的hannoi(n-1,a,c,b);呼叫的他啊,返回到這裡,繼續向後又遇到move(n,a,c); 這裡不用講解了吧,輸出後返回來,繼續向後執行hannoi(n-1,b,a,c); 新的遞迴開始了,看你再列個新的表理一下呢,注意傳入的值和他的順序,還有n的值這時是多少。

其實我的講解你可能看的也不是很清楚,關鍵是要理解到遞迴他無非就是呼叫自己,呼叫完返回就是返回上次呼叫的地方,也是他自己,只是倆次的函式使用中的值是不一樣的,這個值呢,最好拿筆記下來,並寫個次數才容易理解和分析。

這遞迴程式很經典,值得研究,你會發現他是如此的巧妙,太棒了!建議測試的時候不要把n設的太大,不然容易宕機!想想裡面的迴圈次數就真令人咂舌了!

12樓:朝夕流

遞迴就是呼叫自己,可以把遞迴看成一模一樣的樓層如果是三個盤,看成三層樓。

編號1,2,3

n=3時,執行else,hannoi(n-1,a,c,b);在這時呼叫自己,進入遞迴第二層 ,再執行else,hannoi(n-1,a,c,b);這時呼叫自己,進入第三層,這時因為n=1,所以程式執行if,if(n==1) move(1,a,c);編號1移動後,跳出遞迴第三層,回到第二層,這就意味著n=2在 hannoi(n-1,a,c,b);這一步執行完畢,往下執行move(n,a,c);移動後,執行hannoi(n-1,b,a,c);接著呼叫n=1時,完成後第二層執行完成,跳出,執行n=3第一層的move,這樣一直迴圈呼叫,直到move被執行2的n次方減1次,完成移動。

請用C語言編寫遞迴函式,C語言 編寫遞迴函式

迴圈實現。include int main printf d t return 0 簡單修改一下就可以變遞迴了。如下。include int fanzhuan int n,int t int main c語言 編寫遞迴函式 可以看看 演算法精解 kyle loudon著 或者 資料結構 主編 安訓國...

PASCAL遞迴演算法的非遞迴實現問題高分

手寫乙個stack,然後每當需要recursive call的時候push stack,stack非空的時候pop並處理.相當於模擬乙個call stack.即 procedure make1 non rec tx,ty integer vari,x,y integer begin stack.cl...

c語言什麼是遞迴方法,C語言什麼是遞迴方法?

程式設計裡面估計最讓人摸不著頭腦的基本演算法就是遞迴了。很多時候我們看明白乙個複雜的遞迴都有點費時間,尤其對模型所描述的問題概念不清的時候,想要自己設計乙個遞迴那麼就更是有難度了。今天我也花費了半個小時來搞明白二叉樹的平衡性的遞迴模型,首先我不明白什麼叫做平衡性,所以花費的時候大部分實在試探理解平衡...