溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C語(yǔ)言中函數(shù)遞歸的示例分析

發(fā)布時(shí)間:2022-02-09 09:59:10 來(lái)源:億速云 閱讀:179 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹C語(yǔ)言中函數(shù)遞歸的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

什么是遞歸?

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

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

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

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

遞歸的兩個(gè)必要條件

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

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

遞歸實(shí)例

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

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

C語(yǔ)言中函數(shù)遞歸的示例分析

畫(huà)圖講解 

C語(yǔ)言中函數(shù)遞歸的示例分析

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

程序運(yùn)行結(jié)果

C語(yǔ)言中函數(shù)遞歸的示例分析

完整代碼 

#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;
}

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

參考代碼

C語(yǔ)言中函數(shù)遞歸的示例分析

畫(huà)圖講解

C語(yǔ)言中函數(shù)遞歸的示例分析

程序運(yùn)行結(jié)果

C語(yǔ)言中函數(shù)遞歸的示例分析

完整代碼

#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ù)反饋過(guò)程的活動(dòng),其目的通常是為了逼近所需目標(biāo)或結(jié)果。 每一次對(duì)過(guò)程的重復(fù)稱為一次“迭代”,而每一次迭代得到的結(jié)果會(huì)作為下一次迭代的初始值。 目前對(duì)于c語(yǔ)言來(lái)說(shuō),迭代可以簡(jiǎn)單認(rèn)為是循環(huán)結(jié)構(gòu)。

對(duì)于遞歸與迭代,我們同樣通過(guò)兩個(gè)實(shí)例來(lái)理解:

實(shí)例1 (求n的階乘)

方法一(使用遞歸)

參考代碼

C語(yǔ)言中函數(shù)遞歸的示例分析

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

C語(yǔ)言中函數(shù)遞歸的示例分析

完整代碼 

#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;
}

 運(yùn)行結(jié)果

C語(yǔ)言中函數(shù)遞歸的示例分析

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

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

方法一 (遞歸求解)

 參考代碼

C語(yǔ)言中函數(shù)遞歸的示例分析

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

C語(yǔ)言中函數(shù)遞歸的示例分析

運(yùn)行結(jié)果  

C語(yǔ)言中函數(shù)遞歸的示例分析

完整代碼 

#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ù)字較大時(shí),使用遞歸的方法計(jì)算機(jī)所要計(jì)算的量是相當(dāng)大的,因?yàn)槊看斡?jì)算一個(gè)第n項(xiàng)時(shí)都需要計(jì)算第n-1項(xiàng)和第n-2項(xiàng) ,這里我們通過(guò)求解第40項(xiàng)來(lái)觀察fib(3)的計(jì)算次數(shù)來(lái)觀察。

運(yùn)行結(jié)果

C語(yǔ)言中函數(shù)遞歸的示例分析

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

方法二(迭代求解) 

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

C語(yǔ)言中函數(shù)遞歸的示例分析

畫(huà)圖講解 

C語(yǔ)言中函數(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;
}

運(yùn)行結(jié)果 

C語(yǔ)言中函數(shù)遞歸的示例分析

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

這時(shí)候我們會(huì)想:

為什么有時(shí)候用遞歸簡(jiǎn)便,而有時(shí)候用迭代簡(jiǎn)便呢?

注意:

1.許多問(wèn)題是以遞歸的形式進(jìn)行求解的,這只是因?yàn)樗确沁f歸的形式更加清晰。

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

3.當(dāng)一個(gè)問(wèn)題相當(dāng)復(fù)雜時(shí),此時(shí)遞歸實(shí)現(xiàn)的簡(jiǎn)潔性便可以彌補(bǔ)它所帶來(lái)的運(yùn)行開(kāi)銷。

以上是“C語(yǔ)言中函數(shù)遞歸的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI