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

一篇文章帶你了解C語言函數(shù)遞歸

 更新時間:2022年02月08日 16:42:07   作者:Catzzz666  
這篇文章主要為大家詳細(xì)介紹了C語言函數(shù)遞歸,使用數(shù)據(jù)庫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

什么是遞歸?

遞歸(recursion):程序調(diào)用自身的一種編程技巧。

如何理解函數(shù)遞歸:

1.從調(diào)用自身層面:函數(shù)遞歸就是函數(shù)自己調(diào)用自己。

2.從編程技巧層面:一種方法(把一個大型復(fù)雜的程序轉(zhuǎn)換為一個類似的小型簡單的程序),這種方法的主要思想就是把大事化小。

遞歸的兩個必要條件

1.存在限制條件,當(dāng)滿足這個限制條件時,遞歸便不再繼續(xù)。

2.每次遞歸調(diào)用之后越來越接近這個限制條件。

遞歸實例

實例1(按照順序打印一個數(shù)的整形值)

參考代碼(可以先去嘗試是否可以解決問題)

畫圖講解 

注意:在每次打印后都有一個空格。

程序運行結(jié)果

完整代碼 

#include <stdio.h>
void print(int n)
{
if(n>9)
{
print(n/10);
}
printf("%d ", n%10);
}
int main()
{
int num = 1234;
print(num);
return 0;
}

實例2 (使用函數(shù)在不創(chuàng)建變量的情況下求字符串長度)

參考代碼

畫圖講解

程序運行結(jié)果

完整代碼

#include &lt;stdio.h&gt;int Strlen(const char* str){if (*str == '\0')return 0;elsereturn 1 + Strlen(str + 1);}int main(){char* p = "abcd";int len = Strlen(p);printf("%d\n", len);return 0;}

遞歸與迭代

迭代是重復(fù)反饋過程的活動,其目的通常是為了逼近所需目標(biāo)或結(jié)果。 每一次對過程的重復(fù)稱為一次“迭代”,而每一次迭代得到的結(jié)果會作為下一次迭代的初始值。 目前對于c語言來說,迭代可以簡單認(rèn)為是循環(huán)結(jié)構(gòu)。

對于遞歸與迭代,我們同樣通過兩個實例來理解:

實例1 (求n的階乘)

方法一(使用遞歸)

參考代碼

通過數(shù)學(xué)方法講解

完整代碼 

#include <stdio.h>
int fac(int n)
{
	if (n == 1)
		return 1;
	else
		return n * fac(n - 1);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = fac(n);
	printf("%d\n", ret);
	return 0;
}

方法二(使用迭代)

完整代碼

#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	int i = 0;
	int ret = 1;
	for (i = 1; i <= n; i++)
	{
		ret *= i;
	}
	printf("%d\n", ret);
	return 0;
}

 運行結(jié)果

實例2 (求解斐波那契數(shù)列)

斐波那契數(shù)列:指的是這樣一個數(shù)列:1、1、2、3、5、8、13、21、34、……在數(shù)學(xué)上,斐波納契數(shù)列以如下被以遞歸的方法定義:F(1)=1,F(xiàn)(2)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)

方法一 (遞歸求解)

 參考代碼

通過數(shù)學(xué)方法求解 

運行結(jié)果  

完整代碼 

#include <stdio.h>
int fib(int n)
{
	if (n <= 2)
		return 1;
	else
		return fib(n - 1) + fib(n - 2);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = fib(n);
	printf("%d\n", ret);
	return 0;
}

注意:當(dāng)求得的數(shù)字較大時,使用遞歸的方法計算機所要計算的量是相當(dāng)大的,因為每次計算一個第n項時都需要計算第n-1項和第n-2項 ,這里我們通過求解第40項來觀察fib(3)的計算次數(shù)來觀察。

運行結(jié)果

計算第40項時已經(jīng)計算第3項已經(jīng)有三千多萬次,那么如果計算第一百項,一千項...時程序就會崩潰...這是我們就要考慮使用迭代的方法進(jìn)行求解。

方法二(迭代求解) 

參考代碼 (主函數(shù)不變)

畫圖講解 

完整代碼 

#include <stdio.h>
int fib(int n)
{
	int a = 1;
	int b = 1;
	int c = 1;
	while (n > 2)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = fib(n);
	printf("%d\n", ret);
	return 0;
}

運行結(jié)果 

這里我們可以看出遞歸和迭代的運行結(jié)果是一樣的,但是迭代的運行速度要更快。 

這時候我們會想:

為什么有時候用遞歸簡便,而有時候用迭代簡便呢?

注意:

1.許多問題是以遞歸的形式進(jìn)行求解的,這只是因為它比非遞歸的形式更加清晰。

2.但是這些問題的迭代實現(xiàn)往往比遞歸實現(xiàn)效率更高,雖然可讀性差些。

3.當(dāng)一個問題相當(dāng)復(fù)雜時,此時遞歸實現(xiàn)的簡潔性便可以彌補它所帶來的運行開銷。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!    

相關(guān)文章

  • 如何利用C語言輸出3D立體感心形圖詳解

    如何利用C語言輸出3D立體感心形圖詳解

    其實我們在程序中也有很多樂趣的,只是很多人不善于發(fā)現(xiàn),這篇文章主要給大家介紹了關(guān)于C語言輸出3D立體感心形圖的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-12-12
  • 基于C++實現(xiàn)柏林噪聲算法(Perlin?Noise)

    基于C++實現(xiàn)柏林噪聲算法(Perlin?Noise)

    Perlin噪聲(Perlin?noise,又稱為柏林噪聲)指由Ken?Perlin發(fā)明的自然噪聲生成算法,具有在函數(shù)上的連續(xù)性,并可在多次調(diào)用時給出一致的數(shù)值。本文將用C++實現(xiàn)柏林噪聲算法,感興趣的可以了解一下
    2023-03-03
  • C++實現(xiàn)LeetCode(49.群組錯位詞)

    C++實現(xiàn)LeetCode(49.群組錯位詞)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(49.群組錯位詞),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++11?constexpr使用詳解

    C++11?constexpr使用詳解

    constexpr是一種比const?更嚴(yán)格的束縛,?它修飾的表達(dá)式本身在編譯期間可知,?并且編譯器會盡可能的?evaluate?at?compile?time,本文重點給大家介紹C++11?constexpr使用,需要的朋友可以參考下
    2021-12-12
  • C語言實現(xiàn)簡單的三子棋項目

    C語言實現(xiàn)簡單的三子棋項目

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)簡單的三子棋項目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C++實現(xiàn)正整數(shù)的四則運算表達(dá)式

    C++實現(xiàn)正整數(shù)的四則運算表達(dá)式

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)正整數(shù)的四則運算表達(dá)式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • C++中strlen(),sizeof()與size()的區(qū)別

    C++中strlen(),sizeof()與size()的區(qū)別

    本文主要介紹了C++中strlen(),sizeof()與size()的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • VsCode安裝和配置c/c++環(huán)境小白教程(圖文)

    VsCode安裝和配置c/c++環(huán)境小白教程(圖文)

    本文主要介紹了VsCode安裝和配置c/c++環(huán)境小白教程,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C語言中建立和刪除文件連接的相關(guān)函數(shù)講解

    C語言中建立和刪除文件連接的相關(guān)函數(shù)講解

    這篇文章主要介紹了C語言中建立和刪除文件連接的相關(guān)函數(shù)講解,分別為link和unlink函數(shù)的使用,需要的朋友可以參考下
    2015-09-09
  • C語言學(xué)生學(xué)籍管理系統(tǒng)課程設(shè)計

    C語言學(xué)生學(xué)籍管理系統(tǒng)課程設(shè)計

    這篇文章主要介紹了C語言學(xué)生學(xué)籍管理系統(tǒng)課程設(shè)計,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評論

会昌县| 祁门县| 石渠县| 安国市| 甘谷县| 玉树县| 伊吾县| 逊克县| 南昌县| 阳山县| 韶关市| 郴州市| 栾川县| 汤阴县| 富阳市| 敦化市| 喀喇沁旗| 浠水县| 田阳县| 永安市| 曲阳县| 横山县| 兴仁县| 卫辉市| 高雄县| 社旗县| 菏泽市| 天台县| 青海省| 桐柏县| 封开县| 赤壁市| 门源| 黄石市| 怀远县| 太白县| 宿迁市| 三穗县| 黎城县| 汉川市| 凤城市|