日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

经典递归——斐波那契数列,汉诺塔

發(fā)布時(shí)間:2025/3/17 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 经典递归——斐波那契数列,汉诺塔 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

斐波那契

漢諾塔

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。