亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語言深入探索遞歸的特點

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

遞歸的認(rèn)識

基本認(rèn)識:

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

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

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

理論認(rèn)識:

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

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

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

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

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

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

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

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

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

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

遞歸核心思想講解

我們在平時中見過這個題目,叫做求字符串長度。

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

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

經(jīng)過一次次的大事化小,我們最后把問題變成了,求1+空字符串的長度,這個其實也就是我們想要的遞歸出口,當(dāng)沒有字符時我們就該結(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;
}

遞歸的缺點

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

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

代碼如下:求第十個菲波那切數(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ù)字比較大就會非常慢。這個本質(zhì)就是上述說的成本問題。

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

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個時就已經(jīng)10秒了,這個很長時間啦。我們用全局變量接收下次數(shù),那我們看看他計算了多少次第3個菲波那切數(shù)計算了幾次? 計算了大概1億多次,所以遞歸的重

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

我們看個圖示:

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

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

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

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

相關(guān)文章

  • C++ delete之靜態(tài)變量問題詳解

    C++ delete之靜態(tài)變量問題詳解

    這篇文章主要為大家詳細(xì)介紹了C++delete的一些問題,學(xué)習(xí)如何動態(tài)創(chuàng)建對象,動態(tài)創(chuàng)建的對象與一般對象的區(qū)別,動態(tài)創(chuàng)建的對象的初始化以及釋放動態(tài)分配的內(nèi)存等知識點,感興趣的朋友可以參考一下
    2021-09-09
  • 利用C語言實現(xiàn)“百馬百擔(dān)”問題方法示例

    利用C語言實現(xiàn)“百馬百擔(dān)”問題方法示例

    百馬百擔(dān)是道經(jīng)典的算法題,下面這篇文章主要給大家介紹了利用C語言實現(xiàn)“百馬百擔(dān)”問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • 解析結(jié)構(gòu)體的定義及使用詳解

    解析結(jié)構(gòu)體的定義及使用詳解

    本篇文章是對結(jié)構(gòu)體的定義以及使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 深入了解C++智能指針的使用

    深入了解C++智能指針的使用

    智能指針的本質(zhì)就是使用一個對象來接管一段開辟的空間,在該對象在銷毀的時候,自動調(diào)用析構(gòu)函數(shù)來釋放這段內(nèi)存。本文就來和大家詳細(xì)聊聊智能指針的使用,需要的可以參考一下
    2022-10-10
  • OpenCV實現(xiàn)特征檢測和特征匹配方法匯總

    OpenCV實現(xiàn)特征檢測和特征匹配方法匯總

    一幅圖像中總存在著其獨特的像素點,這些點我們可以認(rèn)為就是這幅圖像的特征,成為特征點,本文主要介紹了OpenCV實現(xiàn)特征檢測和特征匹配方法,感興趣的可以了解一下
    2021-08-08
  • C語言中if語句加大括號和不加大括號的區(qū)別介紹

    C語言中if語句加大括號和不加大括號的區(qū)別介紹

    這篇文章主要給大家介紹了關(guān)于C語言中if語句加大括號和不加大括號的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • C語言詳解UDP通信的實現(xiàn)

    C語言詳解UDP通信的實現(xiàn)

    UDP協(xié)議是用戶數(shù)據(jù)報協(xié)議,面向無連接的、不穩(wěn)定、不可靠、不安全的數(shù)據(jù)報傳遞---更像是是收發(fā)短信;UDP傳輸不需要建立連接,傳輸效率更高,在穩(wěn)定的局域網(wǎng)內(nèi)環(huán)境相對可靠;UDP天然支持多客戶端
    2022-05-05
  • C++文件關(guān)鍵詞快速定位出現(xiàn)的行號實現(xiàn)高效搜索

    C++文件關(guān)鍵詞快速定位出現(xiàn)的行號實現(xiàn)高效搜索

    這篇文章主要為大家介紹了C++文件關(guān)鍵詞快速定位出現(xiàn)的行號實現(xiàn)高效搜索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 詳解C++純虛函數(shù)與抽象類

    詳解C++純虛函數(shù)與抽象類

    這篇文章主要介紹了C++純虛函數(shù)與抽象類的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • C++實現(xiàn)猜數(shù)小游戲的實現(xiàn)

    C++實現(xiàn)猜數(shù)小游戲的實現(xiàn)

    這篇文章主要介紹了C++實現(xiàn)猜數(shù)小游戲的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02

最新評論