一篇文章帶你了解C語言函數(shù)遞歸
什么是遞歸?
遞歸(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)用之后越來越接近這個(gè)限制條件。
遞歸實(shí)例
實(shí)例1(按照順序打印一個(gè)數(shù)的整形值)
參考代碼(可以先去嘗試是否可以解決問題)

畫圖講解

注意:在每次打印后都有一個(gè)空格。
程序運(yùn)行結(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;
}實(shí)例2 (使用函數(shù)在不創(chuàng)建變量的情況下求字符串長(zhǎng)度)
參考代碼

畫圖講解

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

完整代碼
#include <stdio.h>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ù)反饋過程的活動(dòng),其目的通常是為了逼近所需目標(biāo)或結(jié)果。 每一次對(duì)過程的重復(fù)稱為一次“迭代”,而每一次迭代得到的結(jié)果會(huì)作為下一次迭代的初始值。 目前對(duì)于c語言來說,迭代可以簡(jiǎn)單認(rèn)為是循環(huán)結(jié)構(gòu)。
對(duì)于遞歸與迭代,我們同樣通過兩個(gè)實(shí)例來理解:
實(shí)例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;
}運(yùn)行結(jié)果

實(shí)例2 (求解斐波那契數(shù)列)
斐波那契數(shù)列:指的是這樣一個(gè)數(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é)方法求解

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

計(jì)算第40項(xiàng)時(shí)已經(jīng)計(jì)算第3項(xiàng)已經(jīng)有三千多萬次,那么如果計(jì)算第一百項(xiàng),一千項(xiàng)...時(shí)程序就會(huì)崩潰...這是我們就要考慮使用迭代的方法進(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;
}運(yùn)行結(jié)果

這里我們可以看出遞歸和迭代的運(yùn)行結(jié)果是一樣的,但是迭代的運(yùn)行速度要更快。
這時(shí)候我們會(huì)想:
為什么有時(shí)候用遞歸簡(jiǎn)便,而有時(shí)候用迭代簡(jiǎn)便呢?
注意:
1.許多問題是以遞歸的形式進(jìn)行求解的,這只是因?yàn)樗确沁f歸的形式更加清晰。
2.但是這些問題的迭代實(shí)現(xiàn)往往比遞歸實(shí)現(xiàn)效率更高,雖然可讀性差些。
3.當(dāng)一個(gè)問題相當(dāng)復(fù)雜時(shí),此時(shí)遞歸實(shí)現(xiàn)的簡(jiǎn)潔性便可以彌補(bǔ)它所帶來的運(yùn)行開銷。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
基于C++實(shí)現(xiàn)柏林噪聲算法(Perlin?Noise)
Perlin噪聲(Perlin?noise,又稱為柏林噪聲)指由Ken?Perlin發(fā)明的自然噪聲生成算法,具有在函數(shù)上的連續(xù)性,并可在多次調(diào)用時(shí)給出一致的數(shù)值。本文將用C++實(shí)現(xiàn)柏林噪聲算法,感興趣的可以了解一下2023-03-03
C++實(shí)現(xiàn)LeetCode(49.群組錯(cuò)位詞)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(49.群組錯(cuò)位詞),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C語言實(shí)現(xiàn)簡(jiǎn)單的三子棋項(xiàng)目
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡(jiǎn)單的三子棋項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
C++實(shí)現(xiàn)正整數(shù)的四則運(yùn)算表達(dá)式
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)正整數(shù)的四則運(yùn)算表達(dá)式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06
C++中strlen(),sizeof()與size()的區(qū)別
本文主要介紹了C++中strlen(),sizeof()與size()的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
VsCode安裝和配置c/c++環(huán)境小白教程(圖文)
本文主要介紹了VsCode安裝和配置c/c++環(huán)境小白教程,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
C語言中建立和刪除文件連接的相關(guān)函數(shù)講解
這篇文章主要介紹了C語言中建立和刪除文件連接的相關(guān)函數(shù)講解,分別為link和unlink函數(shù)的使用,需要的朋友可以參考下2015-09-09
C語言學(xué)生學(xué)籍管理系統(tǒng)課程設(shè)計(jì)
這篇文章主要介紹了C語言學(xué)生學(xué)籍管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01

