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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

C语言用递归求斐波那契数,让你发现递归的缺陷和效率瓶颈

發(fā)布時(shí)間:2024/8/23 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言用递归求斐波那契数,让你发现递归的缺陷和效率瓶颈 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

C語言用遞歸求斐波那契數(shù),讓你發(fā)現(xiàn)遞歸的缺陷和效率瓶頸

分享到:
QQ空間
新浪微博
騰訊微博
豆瓣
人人網(wǎng)
遞歸是一種強(qiáng)有力的技巧,但和其他技巧一樣,它也可能被誤用。

一般需要遞歸解決的問題有兩個(gè)特點(diǎn):
  • 存在限制條件,當(dāng)符合這個(gè)條件時(shí)遞歸便不再繼續(xù);
  • 每次遞歸調(diào)用之后越來越接近這個(gè)限制條件。

遞歸使用最常見的一個(gè)例子就是求階乘,具體描述和代碼請(qǐng)看這里:C語言遞歸和迭代法求階乘

但是,遞歸函數(shù)調(diào)用將涉及一些運(yùn)行時(shí)開銷——參數(shù)必須壓到堆棧中,為局部變量分配內(nèi)存空間(所有遞歸均如此,并非特指求階乘這個(gè)例子),寄存器的值必須保存等。當(dāng)遞歸函數(shù)的每次調(diào)用返回時(shí),上述這些操作必須還原,恢復(fù)成原來的樣子。所以, 基于這些開銷,對(duì)于遞歸求階乘而言,它并沒有簡(jiǎn)化問題的解決方案。

迭代求階乘使用簡(jiǎn)單循環(huán)的程序,看上去不甚符合前面階乘的數(shù)學(xué)定義,但它卻能更為有效地計(jì)算出結(jié)果。如果你仔細(xì)觀察遞歸函數(shù),你會(huì)發(fā)現(xiàn)遞歸調(diào)用是函數(shù)所執(zhí)行的最后一項(xiàng)任務(wù)。這個(gè)函數(shù)是尾部遞歸(tail recursion)的一個(gè)例子。由于函數(shù)在遞歸調(diào)用返回之后不再執(zhí)行任何任務(wù),所以尾部遞歸可以很方便地轉(zhuǎn)換成一個(gè)簡(jiǎn)單循環(huán),完成相同的任務(wù)。

提示:許多問題是以遞歸的形式進(jìn)行解釋的,這只是因?yàn)樗确沁f歸形式更為清晰。但是,這些問題的迭代實(shí)現(xiàn)往往比遞歸實(shí)現(xiàn)效率更高,雖然代碼的可讀性可能稍差一些,當(dāng)一個(gè)問題相當(dāng)復(fù)雜,難以用迭代形式實(shí)現(xiàn)時(shí),此時(shí)遞歸實(shí)現(xiàn)的簡(jiǎn)潔性便可以補(bǔ)償它所帶來的運(yùn)行時(shí)開銷。

這里有一個(gè)更為極端的例子,菲波那契數(shù)就是一個(gè)數(shù)列,數(shù)列中每個(gè)數(shù)的值就是它前面兩個(gè)數(shù)的和。 這種關(guān)系常常用遞歸的形式進(jìn)行描述:


同樣,這種遞歸形式的定義容易誘導(dǎo)人們使用遞歸形式來解決問題。這里有一個(gè)陷牌:它使用遞歸步驟計(jì)算Fibonacci(n-1)和Fibonacci(n-2)。但是,在計(jì)算Fibonacci(n-1)時(shí)也將計(jì)算Fibonacci(n-2)。這個(gè)額外的計(jì)算代價(jià)有多大呢?

答案是,它的代價(jià)遠(yuǎn)遠(yuǎn)不止一個(gè)冗余計(jì)算:每個(gè)遞歸調(diào)用都觸發(fā)另外兩個(gè)遞歸調(diào)用,而這兩個(gè)調(diào)用的任何一個(gè)還將觸發(fā)兩個(gè)遞歸調(diào)用,再接下去的調(diào)用也是如此。這樣,冗余計(jì)算的數(shù)量增長得非常快。例如,在遞歸計(jì)算Fibonacci(10)時(shí),Fibonacci(3)的值被計(jì)算了21次。但是,在遞歸計(jì)算 Fibonacci(30)時(shí),Fibonacci(3)的值被計(jì)算了317811次。當(dāng)然,這317811次計(jì)算所產(chǎn)生的結(jié)果是完全一樣的,除了其中之一外,其余的純屬浪費(fèi)。這個(gè)額外的開銷真是相當(dāng)恐怖!

如果使用一個(gè)簡(jiǎn)單循環(huán)來代替遞歸,這個(gè)循環(huán)的形式肯定不如遞歸形式符合前面菲波那契數(shù)的抽象定義,但它的效率提高了幾十萬倍!

當(dāng)你使用遞歸方式實(shí)現(xiàn)一個(gè)函數(shù)之前,先問問你自己使用遞歸帶來的好處是否抵得上它的代價(jià)。 而且你必須小心:這個(gè)代價(jià)可能比初看上去要大得多。

不信請(qǐng)看下面的代碼,分別用遞歸和迭代計(jì)算斐波那契數(shù),效率差距真是大的驚人。 復(fù)制純文本復(fù)制
  • #include <stdio.h>
  • #include <time.h>
  • #include <windows.h>
  • ?
  • // 遞歸計(jì)算斐波那契數(shù)
  • long fibonacci_recursion( int n )
  • {
  • if( n <= 2 )
  • return 1;
  • ?
  • return fibonacci_recursion(n-1) + fibonacci_recursion(n-2);
  • }
  • ?
  • // 迭代計(jì)算斐波那契數(shù)
  • long fibonacci_iteration( int n )
  • {
  • long result;
  • long previous_result;
  • long next_older_result;
  • ?
  • result = previous_result = 1;
  • ?
  • while( n > 2 ){
  • n -= 1;
  • next_older_result = previous_result;
  • previous_result = result;
  • result = previous_result + next_older_result;
  • }
  • return result;
  • }
  • ?
  • int main(){
  • int N = 45;
  • ?
  • // 遞歸消耗的時(shí)間
  • clock_t recursion_start_time = clock();
  • long result_recursion = fibonacci_recursion(N);
  • clock_t recursion_end_time = clock();
  • ?
  • // 迭代消耗的時(shí)間
  • clock_t iteration_start_time = clock();
  • long result_iteration = fibonacci_iteration(N);
  • clock_t iteration_end_time = clock();
  • ?
  • // 輸出遞歸消耗的時(shí)間
  • printf("Result of recursion: %ld \nTime: %fseconds",
  • fibonacci_recursion(N),
  • (double)(recursion_end_time-recursion_start_time)/CLOCKS_PER_SEC
  • );
  • printf("\n-----------------------\n");
  • // 輸出迭代消耗的時(shí)間
  • printf("Result of iteration: %ld \nTime: %fseconds",
  • fibonacci_iteration(N),
  • (double)(iteration_end_time-iteration_start_time)/CLOCKS_PER_SEC
  • );
  • ?
  • return 0;
  • }
  • #include <stdio.h> #include <time.h> #include <windows.h>// 遞歸計(jì)算斐波那契數(shù) long fibonacci_recursion( int n ) {if( n <= 2 )return 1;return fibonacci_recursion(n-1) + fibonacci_recursion(n-2); }// 迭代計(jì)算斐波那契數(shù) long fibonacci_iteration( int n ) {long result;long previous_result;long next_older_result;result = previous_result = 1;while( n > 2 ){n -= 1;next_older_result = previous_result;previous_result = result;result = previous_result + next_older_result;}return result; }int main(){int N = 45;// 遞歸消耗的時(shí)間clock_t recursion_start_time = clock();long result_recursion = fibonacci_recursion(N);clock_t recursion_end_time = clock();// 迭代消耗的時(shí)間clock_t iteration_start_time = clock();long result_iteration = fibonacci_iteration(N);clock_t iteration_end_time = clock();// 輸出遞歸消耗的時(shí)間printf("Result of recursion: %ld \nTime: %fseconds",fibonacci_recursion(N),(double)(recursion_end_time-recursion_start_time)/CLOCKS_PER_SEC);printf("\n-----------------------\n");// 輸出迭代消耗的時(shí)間printf("Result of iteration: %ld \nTime: %fseconds",fibonacci_iteration(N),(double)(iteration_end_time-iteration_start_time)/CLOCKS_PER_SEC);return 0; } 運(yùn)行結(jié)果: Result of recursion: 1134903170 Time: 7.494000 seconds --------------------------------------- Result of iteration: 1134903170 Time: 0.000000 seconds
    注意:上面的程序最好在GCC(Linux下的GCC或Windows下的Code:Blocks)下運(yùn)行,VC下可能統(tǒng)計(jì)不到運(yùn)行時(shí)間。

    看吧,用遞歸花了將近7.5秒的時(shí)間,但是用迭代幾乎不費(fèi)吹灰之力,效率快到統(tǒng)計(jì)不到運(yùn)行時(shí)間。 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

    總結(jié)

    以上是生活随笔為你收集整理的C语言用递归求斐波那契数,让你发现递归的缺陷和效率瓶颈的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 蜜桃在线一区 | 日本高潮网站 | 欧美视频第一区 | 亚洲一区欧美一区 | 中文字幕人妻精品一区 | 欧美一区久久 | 黄色在线免费看 | 国产精品久久久久久久久晋中 | 欧美一级在线免费观看 | 中文字幕乱码一区 | 日韩av一卡 | 国产三级精品三级在线观看 | 日韩欧美视频一区二区三区 | 波多野结衣免费看 | 爱爱一级 | 黄色激情小说视频 | 中文字幕国产专区 | 97高清国语自产拍 | 97在线免费公开视频 | 风流少妇按摩来高潮 | 中国丰满老妇xxxxx交性 | 古装做爰无遮挡三级聊斋艳谭 | 九七电影院97理论片 | 国产免费又爽又色又粗视频 | 亚洲精品一区二区三区在线观看 | 美女视频黄免费 | 成人免费在线视频网站 | 肉嫁高柳家在线看 | 高清不卡一区二区三区 | 国产精品亚洲色图 | 亚洲熟妇无码一区二区三区导航 | 国产亚洲欧美在线视频 | 大j8福利视频导航 | 男女日皮视频 | 黄色网页入口 | 男女日皮视频 | 内地级a艳片高清免费播放 91在线精品一区二区 | 欧美日韩免费看 | 在线视频免费观看一区 | 亚洲欧美中文日韩在线 | 女人张开腿让男人插 | 国产波霸爆乳一区二区 | av电影免费在线播放 | 国产婷婷色一区二区三区 | 涩涩资源站 | 欧美老女人性生活视频 | 男人看片网站 | 久久久久久麻豆 | 国产系列在线观看 | 国产18在线 | 成人av在线播放网站 | 淫岳高潮记小说 | 97香蕉久久夜色精品国产 | 91一区二区在线观看 | av手机版| 精品久久久久一区 | 亚洲天堂久久新 | 国产成人久久77777精品 | 久久久精品福利 | 亚洲人成影视 | 久久爱99 | 成人h在线观看 | 播播激情网 | 精品国产乱码久久久久久久 | 欧美理论视频 | www.日日日| 亚洲精品少妇久久久久久 | 国产免费无码一区二区视频 | 欧美性受视频 | 久久嫩草视频 | 一本色道久久综合亚洲精品小说 | 中文字幕91视频 | 日韩有色 | 在线观看亚洲一区 | 成人在线观看亚洲 | 黄色另类小说 | 国产干b | 欧美,日韩,国产精品免费观看 | 国产精品嫩草影院桃色 | 光溜溜视频素材大全美女 | 成人免费版 | 在线色播| 久久成年 | 国产一级片网址 | 高清一区二区三区四区 | 久久久香蕉 | 国产一区二区黑人欧美xxxx | 无码人妻aⅴ一区二区三区69岛 | 成人精品一区二区三区电影 | 亚洲av人无码激艳猛片服务器 | 小视频在线 | 极品美女无套呻吟啪啪 | 国产一级片免费 | 波多野结衣视频在线播放 | 激情综合小说 | 欧洲精品无码一区二区 | 色多多导航 | 中文字幕精品在线观看 | 国产成人啪精品午夜在线观看 |