斐波那契
漢諾塔
0 1 1 2 3 5 8 13 21
int fibonacci(int a){ if(a==0) return 0; else if(a==1) return 1; else return 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; else return 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; else return fibonacci(a-1)+fibonacci(a-2); }