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