A. 什麼是遞歸演算法
遞歸演算法就是一個函數通過不斷對自己的調用而求得最終結果的一種思維巧妙但是開銷很大的演算法。
比如:
漢諾塔的遞歸演算法:
void move(char x,char y){
printf("%c-->%c\n",x,y);
}
void hanoi(int n,char one,char two,char three){
/*將n個盤從one座藉助two座,移到three座*/
if(n==1) move(one,three);
else{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
main(){
int n;
printf("input the number of diskes:");
scanf("%d",&n);
printf("The step to moving %3d diskes:\n",n);
hanoi(n,'A','B','C');
}
我說下遞歸的理解方法
首先:對於遞歸這一類函數,你不要糾結於他是干什麼的,只要知道他的一個模糊功能是什麼就行,等於把他想像成一個能實現某項功能的黑盒子,而不去管它的內部操作先,好,我們來看下漢諾塔是怎麼樣解決的
首先按我上面說的把遞歸函數想像成某個功能的黑盒子,void hanoi(int n,char one,char two,char three); 這個遞歸函數的功能是:能將n個由小到大放置的小長方形從one 位置,經過two位置 移動到three位置。那麼你的主程序要解決的問題是要將m個的"漢諾塊"由A藉助B移動到C,根據我們上面說的漢諾塔的功能,我相信傻子也知道在主函數中寫道:hanoi(m,A,B,C)就能實現將m個塊由A藉助B碼放到C,對吧?所以,mian函數裡面有hanoi(m,'A','C','B');這個調用。
接下來我們看看要實現hannoi的這個功能,hannoi函數應該幹些什麼?
在hannoi函數里有這么三行
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
同樣以黑盒子的思想看待他,要想把n個塊由A經過B搬到C去,是不是可以分為上面三步呢?
這三部是:第一步將除了最後最長的那一塊以外的n-1塊由one位置經由three搬到two 也就是從A由C搬到B 然後把最下面最長那一塊用move函數把他從A直接搬到C 完事後 第三步再次將剛剛的n-1塊藉助hannoi函數的功能從B由A搬回到C 這樣的三步實習了n塊由A經過B到C這樣一個功能,同樣你不用糾結於hanoi函數到底如何實現這個功能的,只要知道他有這么一個神奇的功能就行
最後:遞歸都有收尾的時候對吧,收尾就是當只有一塊的時候漢諾塔怎麼個玩法呢?很簡單吧,直接把那一塊有Amove到C我們就完成了,所以hanoni這個函數最後還要加上 if(n==1)move(one,three);(當只有一塊時,直接有Amove到C位置就行)這么一個條件就能實現hanoin函數n>=1時將n個塊由A經由B搬到C的完整功能了。
遞歸這個復雜的思想就是這樣簡單解決的,呵呵 不知道你看懂沒?純手打,希望能幫你理解遞歸
總結起來就是不要管遞歸的具體實現細節步驟,只要知道他的功能是什麼,然後利用他自己的功能通過調用他自己去解決自己的功能(好繞口啊,日)最後加上一個極限情況的條件即可,比如上面說的1個的情況。
B. 在C語言中什麼叫遞歸
遞歸:就是自己調自己,但是沒終止條件會死循環,所以你的遞歸代碼里有結束自調自的條件,這樣就創造了有限次的循環(代碼中你看不到for或foreach但是有循環發生)
C. 在計算機演算法中,迭代和遞歸是什麼意思它們有什麼區別
舉個例子:我想求1+2+3+4+..+100的值。
迭代的做法:從1到100,順著往下累加。1+2=3,3+3=6,6+4=10,10+5=15……
程序表示,
int i=1,sum=0;
while(i<=100){
sum = sum +i;
}
遞歸的做法:我要求1到100的累加值,如果我已經得到1到99的累加值,將這個值加上100就是1到100的累加值;要得到1到99的累加值,如果已經得到1到98的累加值,將這個值加上99,就是1到99的累加值……最後我要得到1到2的累加值,我如果得到1自身累加值,再加上2即可,1自身的累加值顯然就是1了。於是現在我們得到了1到2的累加值,將這個值加3就得到了1到3的累加值,……最後直到得到1到100的累加值。
程序表示,其中函數會調用自身,這就是遞歸方法的典型特徵
int GetSum(int n)
{
if(n<=0) return 0;
else return n+GetSum(n-1);
}
上述例子中,其實遞歸最後得到結果也是用迭代方法完成的,只是在程序的處理上直觀看不出來。兩者都能很好的完成計算任務,不同之處在於思維方式上,從而導致不同的計算方法:迭代是正向思維,從頭到尾思考問題;遞歸是逆向思維,他假設我們已經得到了部分結果(假設我已經知道了1到99的累加值,把這個值加上100我們就得到了1到100的累加值了),從尾部追溯到頭部,從而讓問題簡化(當然這個例子中看不出來,這里只是方便理解,有興趣可以參考一下http://ke..com/view/568949.htm 斐波那契數列 的構造方法)。