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

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

生活随笔

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

编程问答

【算法基础】经典例题说递归

發(fā)布時(shí)間:2024/1/1 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【算法基础】经典例题说递归 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

  • 【算法基礎(chǔ)】經(jīng)典例題說(shuō)遞歸
    • 遞歸簡(jiǎn)介
      • 遞歸的適用范圍
      • 遞歸的基本思路
    • 經(jīng)典例題解析
      • 移梵塔
        • 題目描述
        • 題目分析
        • 題解
      • 九連環(huán)
        • 題目描述
        • 題目分析
        • 題解
    • 更新日志

【算法基礎(chǔ)】經(jīng)典例題說(shuō)遞歸

遞歸簡(jiǎn)介

遞歸是一種編程技巧,一種解決問(wèn)題的思維方式。通過(guò)函數(shù)的自我調(diào)用寫(xiě)出簡(jiǎn)潔漂亮、可解釋性強(qiáng)的代碼。

遞歸:參見(jiàn)遞歸。

遞歸的適用范圍

遞歸的思維方式適用于解決層層嵌套、層層相似的問(wèn)題。要解決本層問(wèn)題就需要先把上一層問(wèn)題解決掉,而且每一層的解決方法與上一層的解決方法相似。(就像套娃一樣,一層套一層,每層都長(zhǎng)得差不多)

生活中許多問(wèn)題都滿足層層嵌套的特性。如漢諾塔、九連環(huán)的解法,謝爾賓斯基三角形的繪制,二進(jìn)制數(shù)的進(jìn)位…

拓展閱讀:
漢諾塔,二進(jìn)制和謝爾賓斯基三角形(上)
漢諾塔,二進(jìn)制和謝爾賓斯基三角形(下)

遞歸的基本思路

遞歸最重要的就是找到實(shí)現(xiàn)需求的過(guò)程中反反復(fù)復(fù)一直在執(zhí)行的核心操作是什么,并且找到和核心操作不太一樣的邊界操作,從而確定觸底條件
(這個(gè)在觸底條件上,和核心操作不太一樣的操作,就像套娃里面最小的那個(gè)套娃,和別的大套娃不一樣,它肚子不開(kāi)口。邊界操作不再自我調(diào)用。

層層深入->觸底->層層返回

層層深入(核心操作的自我調(diào)用,增加遞歸深度)
觸底(不再自我調(diào)用,開(kāi)始返回的分界點(diǎn))
層層返回(return)

經(jīng)典例題解析

移梵塔

時(shí)間限制: 1 Sec 內(nèi)存限制: 64 MB

題目描述

有三根柱A、B、C,在A柱上有n塊盤(pán)片,所有盤(pán)片都是大片在下面,小片放在大片上面。并依次編好序號(hào)。現(xiàn)要將A上的n塊盤(pán)片移到C柱上,每次只能移動(dòng)一片,而且在同一根柱子上必須保持上面的盤(pán)片比下面的盤(pán)片小,請(qǐng)輸出移動(dòng)方法。

輸入
僅一個(gè)整數(shù)n(n≤20),表示A柱上的盤(pán)片數(shù)。

輸出
輸出盤(pán)片的移動(dòng)步驟。

樣例輸入
3

樣例輸出
A-1-C
A-2-B
C-1-B
A-3-C
B-1-A
B-2-C
A-1-C

題目分析

讀題可知漢諾塔的解法符合層層嵌套、層層相似的特性,故采用遞歸算法。
任意盤(pán)片堆都是由一個(gè)更小的小盤(pán)片堆加一片大盤(pán)片構(gòu)成的。想要讓這個(gè)盤(pán)片堆移動(dòng),就必須三步走:①先把小盤(pán)片堆移動(dòng)到暫存柱上,②這樣大盤(pán)片才能移動(dòng)到目標(biāo)柱,③最后小盤(pán)片堆移動(dòng)到大盤(pán)片上。
因?yàn)樵谕桓由媳仨毐3稚厦娴谋P(pán)片比下面的盤(pán)片小,所以移動(dòng)小盤(pán)片堆使小盤(pán)片堆離開(kāi)初始柱的操作可以等價(jià)于移動(dòng)小盤(pán)片堆中最大的盤(pán)片。
在這里比較特殊的是第一片盤(pán)片,它上面沒(méi)有其他盤(pán)片,可以自由移動(dòng)。

核心操作:把小盤(pán)片堆從A柱移動(dòng)到C柱

邊界操作:移動(dòng)第一片盤(pán)片

觸底條件:正在移動(dòng)的盤(pán)片是第一片盤(pán)片

題解

先放完整代碼(C語(yǔ)言)對(duì)整體算法有個(gè)宏觀理解:

#include <stdio.h>void hanoi(int num,char a,char b,char c){if(num==1){printf("%c-%d-%c\n",a,num,c);}else{hanoi(num-1,a,c,b);printf("%c-%d-%c\n",a,num,c);hanoi(num-1,b,a,c);} }int main() {int num;scanf("%d",&num);hanoi(num,'A','B','C');return 0; }

接著是注釋版本,可以對(duì)照理解:

#include <stdio.h>//hanoi():第num片盤(pán)片從起始柱a移動(dòng)到目標(biāo)柱c //b為盤(pán)片移動(dòng)三步走中會(huì)用到的暫存柱 void hanoi(int num,char a,char b,char c){if(num==1){//當(dāng)前移動(dòng)盤(pán)片為第一片盤(pán)片的時(shí)候直接移動(dòng)就好啦printf("%c-%d-%c\n",a,num,c);/*↑【注意】↑只有一步所以直接打印了*/}else{//盤(pán)片移動(dòng)三步走hanoi(num-1,a,c,b);//小盤(pán)片堆從起始柱移動(dòng)到暫存柱(a->b)printf("%c-%d-%c\n",a,num,c);//大盤(pán)片從起始柱移動(dòng)到目標(biāo)柱(a->c)/*↑【注意】↑只有一步所以直接打印了*/hanoi(num-1,b,a,c);//小盤(pán)片堆從暫存柱移動(dòng)到目標(biāo)柱(b->c)} }int main() {int num;scanf("%d",&num);//讀入盤(pán)片總數(shù)numhanoi(num,'A','B','C');return 0; }

九連環(huán)

時(shí)間限制: 1 Sec 內(nèi)存限制: 64 MB

題目描述

九連環(huán)是由九個(gè)彼此套接的圓環(huán)和一根橫桿組成,九個(gè)環(huán)從左到右依次為l~9,每個(gè)環(huán)有兩種狀 態(tài):1和0,1表示環(huán)在桿上,0表示環(huán)不在桿上。初始狀態(tài)是九個(gè)環(huán)都在桿上,即:111111111,目標(biāo)狀態(tài)是九個(gè)環(huán)都不在桿上,即:000000000,由初始狀態(tài)到目標(biāo)狀態(tài)的變化規(guī)則是:
(1)第一環(huán)為無(wú)論何時(shí)均可自由上下橫行;
(2)第二只環(huán)只有在第一環(huán)為1時(shí),才能自由上下;
(3)想要改變第n(n>2)個(gè)環(huán)的狀態(tài),需要先使第一到第(n-2)環(huán)均為下桿,且第n-1個(gè)環(huán)為上桿,而與第n+l個(gè)到第九環(huán)狀態(tài)無(wú)關(guān);
(4)每改變一個(gè)環(huán),記為一步。
現(xiàn)在九連環(huán)由111111111變到000000000,求中間第i步的狀態(tài)。

輸入
僅包含一個(gè)整數(shù)i。

輸出
僅包含中間第i步的狀態(tài)。如果輸入的步數(shù)大于實(shí)際變換所需的步數(shù),則輸出-1。

樣例輸入
【樣例1】
2
【樣例2】
500

樣例輸出
【樣例1】
010111111
【樣例2】
-1

題目分析

讀題可知九連環(huán)的解法符合層層嵌套、層層相似的特性,故采用遞歸算法。

核心操作:解環(huán)

想要改變第n(n>2)個(gè)環(huán)的狀態(tài),需要先使第一到第(n-2)環(huán)均為下桿,且第n-1個(gè)環(huán)為上桿,而與第n+l個(gè)到第九環(huán)狀態(tài)無(wú)關(guān);

邊界操作:解第一個(gè)環(huán)

(1)第一環(huán)為無(wú)論何時(shí)均可自由上下橫行;

觸底條件:當(dāng)前在解的環(huán)是第一個(gè)環(huán)

分析解環(huán)過(guò)程,解環(huán)會(huì)對(duì)前面的環(huán)的狀態(tài)產(chǎn)生影響,但是不會(huì)對(duì)后面的環(huán)產(chǎn)生影響。所以從后往前解環(huán)才能把九連環(huán)解開(kāi)。

題解

先放完整代碼(C語(yǔ)言)對(duì)整體算法有個(gè)宏觀理解:

#include <stdio.h>int step; int pos[10]={1,1,1,1,1,1,1,1,1,1};void turn(int num){if(step==0) return;if(pos[num-1]==0) turn(num-1);for(int i=num-2;i>=1;i--){if(pos[i]==1) turn(i);}if(step==0) return;pos[num]=(pos[num]+1)%2;step--; }int main() {scanf("%d",&step);for(int i=9;i>=1;i--){turn(i);}if(step==0){for(int i=1;i<=9;i++){printf("%d",pos[i]);}putchar('\n');}else if(step>0){puts("-1");}return 0; }

然后這里是非常非常詳細(xì)的注釋,看不懂可以對(duì)照著看:

#include <stdio.h>//step:操作步數(shù),在turn()函數(shù)中倒數(shù)計(jì)數(shù) int step;//pos數(shù)組:記錄環(huán)的情況 /*【注意】只有九個(gè)環(huán)但是我開(kāi)了10個(gè)位置 的數(shù)組,1~9才是記錄環(huán)的情況的,其中pos[0] 記錄的1是為了減少代碼量,避免第一個(gè)環(huán)的情況 需要單獨(dú)列出。*/ int pos[10]={1,1,1,1,1,1,1,1,1,1};//turn()函數(shù):改變第num個(gè)環(huán)的狀態(tài),套上或卸下 /*這個(gè)函數(shù)采用了遞歸的方法,但是它的觸底條件比較隱蔽, 仔細(xì)觀察可以發(fā)現(xiàn)當(dāng)num=1時(shí)函數(shù)就不再自我調(diào)用了, 它就是邊界操作。所以,num=1是觸底條件。*/ void turn(int num){/*當(dāng)步數(shù)走完就需要讓函數(shù)返回,不讓它再做其他什么操作使得結(jié)果改變*/if(step==0) return;//解環(huán)的預(yù)先操作,先讓當(dāng)前環(huán)前面的環(huán)滿足解環(huán)的條件if(pos[num-1]==0) turn(num-1);/*↑【注意】↑看這里!如果pos數(shù)組0~9存狀態(tài),當(dāng)num=0就要單獨(dú)列出操作了,因?yàn)閿?shù)組會(huì)溢出*/for(int i=num-2;i>=1;i--){if(pos[i]==1) turn(i);}/*預(yù)先操作過(guò)程中最后一步如果step已經(jīng)到達(dá)0,返回到上一層就會(huì)一直往下執(zhí)行,這樣step就會(huì)變成負(fù)數(shù)了。這樣可不行!趕緊把它return掉!>A<*/if(step==0) return;//解開(kāi)當(dāng)前環(huán),并記錄步數(shù)pos[num]=(pos[num]+1)%2;step--; }int main() {//讀入題目給出的步數(shù)scanf("%d",&step);//從后往前解環(huán)for(int i=9;i>=1;i--){turn(i);}//輸出答案/*(step==0) 步數(shù)走完了(step>0) 步數(shù)沒(méi)走完*/if(step==0){for(int i=1;i<=9;i++){printf("%d",pos[i]);}putchar('\n');}else if(step>0){puts("-1");}return 0; }

更新日志

2020-2-6
第一版完成!o( ̄▽ ̄)ブ
只寫(xiě)了兩題是因?yàn)槲宜㈩}刷得少orz
遞歸好難啊好難啊,想破腦殼殼QAQ
但是遞歸好神奇,本小白對(duì)它充滿喜歡,我一定要把遞歸這只小妖精抱緊緊!!!

總結(jié)

以上是生活随笔為你收集整理的【算法基础】经典例题说递归的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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

主站蜘蛛池模板: 正在播放老肥熟妇露脸 | 97在线公开视频 | 欧美日韩亚洲在线 | 国产一区 在线播放 | 亚洲色图另类图片 | 很黄很污的视频 | 最近更新中文字幕 | 一区二区在线不卡 | 操极品少妇 | 久草一区 | 美女被娇喘流出白 | 欧美xxxx中国 | 人人爽爽爽 | 欧美黄色性 | 国产成人av无码精品 | 激情文学8888| 免费国产羞羞网站视频 | 日本韩国在线播放 | 懂色av蜜臀av粉嫩av分享吧最新章节 | 亚洲另类自拍 | 在线免费观看高清视频 | 欧美日韩一区二区在线观看 | 精品久久久久久久久久 | 亚洲欧美网站 | 欧美成年人视频 | 亚洲午夜在线观看 | 国产精品一线二线三线 | 国产精品久久久久久妇女6080 | 久久久久久久久精 | 99re6在线精品视频免费播放 | 亚洲性精品| 中文字幕一区二区三区波野结 | 处破痛哭a√18成年片免费 | 亚洲不卡视频在线观看 | 久久久久久免费毛片精品 | 日韩中文字幕在线 | 国产一卡在线 | 亚洲色图欧美视频 | 少妇色欲网 | 国产精品久久77777 | 国产精品久久 | 欧美性黄色 | 嫩草网站入口 | 国产视频一区二区三区四区 | 婷婷黄色网 | 又污又黄又爽的网站 | 亚洲国产在| 亚洲1级片 | 久久久中文 | 久草视频精品 | 亚洲天堂小说 | 成人a在线| 亚洲图片欧美另类 | 亚洲天堂五月天 | 国产乱码精品一品二品 | 国产综合视频一区 | 用我的手指扰乱你 | 手机在线一区二区三区 | 在线观看1区 | 色综合五月天 | 欧美日韩精品久久 | 97视频资源 | 久久免费手机视频 | 亚洲自拍偷拍一区二区三区 | 欧美精品黑人猛交高潮 | 女性向av免费网站 | 黄色免费视频 | 艹久久 | 一区二区三区成人 | 看黄色一级视频 | 国产美女自拍视频 | 毛片av网站| jizz视频在线观看 | 成人片免费视频 | 午夜国产小视频 | 黄色片hd| 精品婷婷 | 最新中文字幕免费 | 国产福利不卡 | 狼人色综合 | 日韩精品国产一区 | 在线观看日韩中文字幕 | 日韩一级影院 | 91香蕉视频黄 | 91大神精品| 黄色片在线免费观看 | 欧美日韩一区二区不卡 | 精品不卡在线 | 在线免费观看国产精品 | 3344av| 2018av在线 | 日本视频在线播放 | 一级在线播放 | 一级精品毛片 | 亚洲综合激情小说 | 国产成人精品免费网站 | 亚洲AV无码成人精品区东京热 | 成年人小视频在线观看 | 韩国黄色av |