最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言深入探索遞歸的特點(diǎn)

 更新時(shí)間:2022年06月07日 10:42:51   作者:沙漠下的胡楊  
程序調(diào)???的編程技巧稱為遞歸 recursion)函數(shù)??調(diào)???就是遞歸,你也可以理解成是?種嵌套結(jié)構(gòu),但遞歸分為倆部分,第?是“遞”,進(jìn)?嵌套結(jié)構(gòu)。第?是”歸“,最終會(huì)?步?步返回。第?次接觸遞歸都會(huì)很懵,慢慢理解這個(gè)過(guò)程就明?了

遞歸的認(rèn)識(shí)

基本認(rèn)識(shí):

1.首先遞歸的本質(zhì)還是函數(shù)調(diào)用,也要形成和釋放棧幀。

2.函數(shù)的調(diào)用是有成本的,這個(gè)成本在時(shí)間和空間上表現(xiàn)為函數(shù)棧幀的形成和銷毀。

3.遞歸就是 不斷形成棧幀和銷毀的過(guò)程。

理論認(rèn)識(shí):

1.內(nèi)存和cpu中的資源有限,也就決定啦,合理的遞歸是絕對(duì)不可以無(wú)限遞歸下去的。

2.遞歸不是什么時(shí)候都可以使用的,而是要滿足自身的場(chǎng)景,即目標(biāo)函數(shù)的子問(wèn)題可以用該算法解決,本質(zhì)是分治的思想。

3.遞歸的核心:大事化小,遞歸出口。

main函數(shù)可以遞歸嗎

相信有些讀者就在疑惑啦?main函數(shù)是主函數(shù)呀,這個(gè)怎么可以自己調(diào)用自己呢?

實(shí)際上,main函數(shù)本質(zhì)也是函數(shù),所以也就會(huì)形成棧幀,所以是可以自己調(diào)用自己的。

代碼和運(yùn)行結(jié)果如下:

int main()
{
	printf("胡楊樹下\n");
	Sleep(100);//睡眠0.1秒
	main();
	return 0;
}

結(jié)果顯示是可以調(diào)用的,那么我們也能過(guò)看出來(lái),這個(gè)main函數(shù)的遞歸是不會(huì)自動(dòng)停止的,停止時(shí)就是發(fā)生棧溢出,那么函數(shù)的棧幀是怎么形成的呢?

是最下面的main函數(shù)進(jìn)行調(diào)用自身形成棧幀,如圖示,我們可以看出,這些函數(shù)調(diào)用都開辟了空間,所以要占用內(nèi)存,而且形成棧幀后需要釋放,形成和釋放過(guò)程中有時(shí)間消耗。這也就是遞歸有成本的原因。

遞歸核心思想講解

我們?cè)谄綍r(shí)中見(jiàn)過(guò)這個(gè)題目,叫做求字符串長(zhǎng)度。

這個(gè)我們可以用遞歸的寫法求解,順帶我們看下遞歸的核心。

首先假設(shè)我們求的字符為 "abcdefg123",我們用遞歸的解法可以轉(zhuǎn)化為,1+"bcdefg123",把"bcdefg123"進(jìn)而再轉(zhuǎn)化為1+"cdefg123",進(jìn)行求解,如圖示:

經(jīng)過(guò)一次次的大事化小,我們最后把問(wèn)題變成了,求1+空字符串的長(zhǎng)度,這個(gè)其實(shí)也就是我們想要的遞歸出口,當(dāng)沒(méi)有字符時(shí)我們就該結(jié)束啦。

代碼如下:

int My_strlen(const char *str)
{
	if (*str == '\0')//函數(shù)出口
	{
		return 0;
	}
	return 1 + My_strlen(str + 1);//繼續(xù)
}
int main()
{
	int len = My_strlen("abcdefg123");
	printf("len = %d\n", len);
	return 0;
}

遞歸的缺點(diǎn)

我們來(lái)看下遞歸的另外一個(gè)經(jīng)典例子,第n個(gè)菲波那切數(shù)列的實(shí)現(xiàn)

首先菲波那切數(shù)列是前兩個(gè)數(shù)之和等于第三個(gè)數(shù),第一個(gè)和第二個(gè)我們?cè)O(shè)定為1,那么這個(gè)數(shù)列為 1,1,2,3,5,8,13....等等,那我們要求第n個(gè)斐波那契數(shù)列的話,只要轉(zhuǎn)化為求前兩個(gè)數(shù)的和就好了,最后的遞歸出口為第一個(gè)或者第二個(gè)數(shù)時(shí)停止,結(jié)束函數(shù)。

代碼如下:求第十個(gè)菲波那切數(shù)

int fib(int n)
{
	if (n == 1 || n == 2)
	{
		return 1;
	}
	return fib(n - 1) + fib(n - 2);
}
int main()
{
	printf("fib(%d) = %d\n", 10, fib(10));
	return 0;
}

我們?nèi)绻蟮?n 的數(shù)字比較大就會(huì)非常慢。這個(gè)本質(zhì)就是上述說(shuō)的成本問(wèn)題。

如果求的是第42個(gè)菲波那切數(shù)呢?這次我們把時(shí)間也計(jì)算上。

int fib(int n)
{
	if (n == 1 || n == 2)
	{
		return 1;
	}
	return fib(n - 1) + fib(n - 2);
}
int main()
{
	int n = 42;
	double start = GetTickCount();
	int x = fib(n);
	double end = GetTickCount();
	printf("fib(%d) = %d count = %.1f S\n", n,x,(end - start)/1000);
	return 0;
}

我們可以看出第42個(gè)時(shí)就已經(jīng)10秒了,這個(gè)很長(zhǎng)時(shí)間啦。我們用全局變量接收下次數(shù),那我們看看他計(jì)算了多少次第3個(gè)菲波那切數(shù)計(jì)算了幾次? 計(jì)算了大概1億多次,所以遞歸的重

復(fù)計(jì)算是非常多的。

我們看個(gè)圖示:

其中單單是第六個(gè)菲波那切數(shù)就計(jì)算了3次,這個(gè)就很夸張啦。

所以遞歸的特點(diǎn)是代碼簡(jiǎn)單,但是調(diào)用上可能會(huì)有大的成本。

最后一點(diǎn)就是:循環(huán)和遞歸是一定可以相互轉(zhuǎn)化的。只不過(guò)有些時(shí)候轉(zhuǎn)化會(huì)比較麻煩。

到此這篇關(guān)于C語(yǔ)言深入探索遞歸的特點(diǎn)的文章就介紹到這了,更多相關(guān)C語(yǔ)言遞歸內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中的三種繼承public,protected,private詳細(xì)解析

    C++中的三種繼承public,protected,private詳細(xì)解析

    我們已經(jīng)知道,在基類以private方式被繼承時(shí),其public和protected成員在子類中變?yōu)閜rivate成員。然而某些情況下,需要在子類中將一個(gè)或多個(gè)繼承的成員恢復(fù)其在基類中的訪問(wèn)權(quán)限
    2013-09-09
  • Qt開發(fā)之QString類的使用教程詳解

    Qt開發(fā)之QString類的使用教程詳解

    本文主要介紹了Qt中QString類的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-11-11
  • Prim(普里姆)算法求最小生成樹的思想及C語(yǔ)言實(shí)例講解

    Prim(普里姆)算法求最小生成樹的思想及C語(yǔ)言實(shí)例講解

    Prim算法能夠在帶權(quán)的圖中搜索出最小生成樹,這也是各大ACM和面試及考研題目中的熱點(diǎn),下面我們就來(lái)詳細(xì)看一下Prim(普里姆)算法求最小生成樹的思想及C語(yǔ)言實(shí)例講解
    2016-06-06
  • 采用C++實(shí)現(xiàn)區(qū)間圖著色問(wèn)題(貪心算法)實(shí)例詳解

    采用C++實(shí)現(xiàn)區(qū)間圖著色問(wèn)題(貪心算法)實(shí)例詳解

    這篇文章主要介紹了采用C++實(shí)現(xiàn)區(qū)間圖著色問(wèn)題(貪心算法),很經(jīng)典的算法問(wèn)題,需要的朋友可以參考下
    2014-07-07
  • C語(yǔ)言數(shù)組任意位置插入一個(gè)元素方法

    C語(yǔ)言數(shù)組任意位置插入一個(gè)元素方法

    這篇文章主要給大家分享C語(yǔ)言數(shù)組任意位置插入一個(gè)元素方法,
    2021-11-11
  • QT中QDockWidget控件的使用小結(jié)

    QT中QDockWidget控件的使用小結(jié)

    QDockWidget類提供了一個(gè)小部件,可以??吭赒MainWindow中,也可以作為桌面上的頂級(jí)窗口浮動(dòng),本文主要介紹了QT中QDockWidget控件的使用小結(jié),感興趣的可以了解一下
    2024-01-01
  • Qt使用QChart實(shí)現(xiàn)靜態(tài)顯示溫度變化曲線

    Qt使用QChart實(shí)現(xiàn)靜態(tài)顯示溫度變化曲線

    QChart模塊是Qt?Charts庫(kù)的基礎(chǔ),提供了用于創(chuàng)建和顯示各種類型圖表的類和接口,本文主要介紹了如何使用QChart實(shí)現(xiàn)動(dòng)態(tài)顯示3個(gè)設(shè)備的溫度變化曲線,感興趣的可以了解一下
    2023-06-06
  • 詳解c++中的trait與policy模板技術(shù)

    詳解c++中的trait與policy模板技術(shù)

    trait模板和policy模板技術(shù)是把模板的trait和policy這兩個(gè)針對(duì)不同具體類型有變化的方面抽離出來(lái)形成兩個(gè)獨(dú)立的模板。由于trait和policy本身是模板,它的行為是可配置的,在模板中通過(guò)組合或者以模板實(shí)參傳進(jìn)來(lái)的方式使用trait和policy,就可以配置出不同的具體實(shí)現(xiàn)
    2021-06-06
  • Qt線程池QThreadPool的使用詳解

    Qt線程池QThreadPool的使用詳解

    本文主要介紹了Qt線程池QThreadPool的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • C語(yǔ)言實(shí)現(xiàn)文本文件/二進(jìn)制文件格式互換

    C語(yǔ)言實(shí)現(xiàn)文本文件/二進(jìn)制文件格式互換

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)文本文件和二進(jìn)制文件格式互換,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03

最新評(píng)論

城口县| 深泽县| 麻江县| 墨江| 高要市| 丰台区| 湖州市| 西乡县| 邢台市| 大田县| 博兴县| 济宁市| 合水县| 博乐市| 景德镇市| 阆中市| 米易县| 错那县| 贵德县| 金沙县| 冕宁县| 云浮市| 祁门县| 淳安县| 南通市| 乳源| 南丹县| 右玉县| 肥乡县| 龙井市| 鸡西市| 武义县| 若尔盖县| 从化市| 离岛区| 启东市| 福建省| 太白县| 新兴县| 白玉县| 治多县|