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