经典递归——斐波那契数列,汉诺塔
斐波那契
漢諾塔
0?1?1?2?3?5?8?13?21
int fibonacci(int a){if(a==0)return 0;else if(a==1)return 1;elsereturn fibonacci(a-1)+fibonacci(a-2); }我也來(lái)搞一下這個(gè)?漢諾塔的調(diào)調(diào):
先來(lái)講一下這個(gè)?東西怎么玩兒
需要做的事情是把?1針上的盤(pán)子都放到3針上面。
要求每次只能移動(dòng)一個(gè)盤(pán)子,并且只能是大盤(pán)子在下,小盤(pán)子在上,對(duì)于每?jī)蓚€(gè)盤(pán)子來(lái)說(shuō)。
所以為了實(shí)現(xiàn)這一目的
Step1:?把1針上的最后一個(gè)盤(pán)子放到3針上面。//移動(dòng)
【前提:這樣就需要先把n-1盤(pán)子放到2針上面。?也就是Step0:】
Step0:這樣就需要先把n-1盤(pán)子放到2針上面。//邏輯
?
//對(duì)于代碼,這句話(huà)本質(zhì)上相當(dāng)于?2針是目標(biāo),也就是?2針上是需要盛盤(pán)子的針。所以2針是目的針,要把n-1個(gè)盤(pán)子從1針?lè)诺?/span>2針上,借助3針,所以abc三根針的關(guān)系在hanoi(n,a,b,c)的本質(zhì)是:a作為移出針,b作為借助針,c作為目標(biāo)針。所以?這里面這句話(huà)應(yīng)該寫(xiě)作:hanoi(n-1,a,c,b);
Step1:
Step2:前提把n-2個(gè)盤(pán)子放到1針上。//邏輯
所以從2針出來(lái),放到1針上,借助,3針。這幾個(gè)參數(shù)就是213.
Step3:把2針上的最后一個(gè)盤(pán)子放到3針上。//移動(dòng)
?
然后?把n-3個(gè)盤(pán)子放到2針上面,也就是?Step0:
然后再?Step1
所以?大概是這樣的:
void hanoi(int n,int a,int b,int c){ if(n==1) printf("%d -> %d \n",a,c);//移動(dòng) else{hanoi(n-1,a,c,b);printf("%d -> %d \n",a,c);//移動(dòng) hanoi(n-1,b,a,c);} }運(yùn)行結(jié)果:
代碼:
/**#include <iostream>int fibonacci(int); void hanoi(int n ,int a,int b, int c);int main(int argc, char** argv) {//printf("%d",fibonacci(1));hanoi(3,1,2,3);return 0; }void hanoi(int n,int a,int b,int c){if(n==1) printf("%d -> %d \n",a,c);//移動(dòng) else{hanoi(n-1,a,c,b);printf("%d -> %d \n",a,c);//移動(dòng) hanoi(n-1,b,a,c);}} /**返回第a個(gè)數(shù)的大小,從0開(kāi)始。 */ int fibonacci(int a){if(a==0)return 0;else if(a==1)return 1;elsereturn fibonacci(a-1)+fibonacci(a-2); }*/試試4個(gè)的:
?
大概那眼睛移動(dòng)了一下,應(yīng)該是沒(méi)有問(wèn)題的。
再來(lái)回顧一下代碼:
/**n代表要移動(dòng)的盤(pán)子的個(gè)數(shù)。 a 代表從哪跟針往外移出。 移出針 b代表借助哪跟針。 借助針 c代表要移動(dòng)到哪根針。 目的針 */ void hanoi(int n,int a,int b,int c){if(n==1) printf("%d -> %d \n",a,c);//移動(dòng) else{hanoi(n-1,a,c,b);//邏輯 printf("%d -> %d \n",a,c);//移動(dòng) hanoi(n-1,b,a,c);//邏輯 } }?
如果只有一個(gè)盤(pán)子,就把盤(pán)子直接從1移動(dòng)到3.
否則就把n-1個(gè)盤(pán)子移動(dòng)到2.
然后把盤(pán)子放到3上。
再把剩下的盤(pán)子從2移到3上。
?
應(yīng)該可以開(kāi)始默寫(xiě)了
Hanoi(int n,int from,int rent,int destination){If(n==1) printf("%d -> %d",from,destination);Else{Hanoi(n-1,from,destination,rent);Printf("%d ->%d",from,destination);Hanoi(n-1,rent,from,destination); }不看還是會(huì)忘的。總之這就是這么個(gè)事兒,算法么~大都是背下來(lái)的。哪有那么多真正會(huì)的人。。。
?
以下源代碼:
#include <iostream>int fibonacci(int); void hanoi(int n ,int a,int b, int c);int main(int argc, char** argv) {//printf("%d",fibonacci(1));hanoi(4,1,2,3);return 0; }/**n代表要移動(dòng)的盤(pán)子的個(gè)數(shù)。 a 代表從哪跟針往外移出。 移出針 b代表借助哪跟針。 借助針 c代表要移動(dòng)到哪根針。 目的針 */ void hanoi(int n,int a,int b,int c){if(n==1) printf("%d -> %d \n",a,c);//移動(dòng) else{hanoi(n-1,a,c,b);//邏輯 printf("%d -> %d \n",a,c);//移動(dòng) hanoi(n-1,b,a,c);//邏輯 } }/**返回第a個(gè)數(shù)的大小,從0開(kāi)始。 */ int fibonacci(int a){if(a==0)return 0;else if(a==1)return 1;elsereturn fibonacci(a-1)+fibonacci(a-2); }?
?
轉(zhuǎn)載于:https://www.cnblogs.com/letben/p/5216713.html
總結(jié)
以上是生活随笔為你收集整理的经典递归——斐波那契数列,汉诺塔的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 图像模糊--快速均值滤波
- 下一篇: 51信用卡 Android自动埋点实践