038 遞迴的幾個小例子

2021-09-12 09:47:31 字數 2323 閱讀 6041

剛接觸遞迴的同學,可能難以理解遞迴,難以理解的點可能很多,例如:

1.函式為什麼可以在自己的內部又呼叫自己呢?

2.既然可以自己呼叫自己,那麼遞迴執行過程中一定回有很多層相互巢狀,到底什麼時候不再巢狀呢?

3.遞迴執行過程中,相互巢狀的多層之間會有引數傳遞,多層之間是否會相互影響?

遞迴兩個要素

1.遞迴邊界

2.遞迴的邏輯——遞迴"公式"

遞迴的過程一定有引數的變化,並且引數的變化,和遞迴邊界有關係.

在難度較大的題目中,這兩者均不容易直接得到.

遞迴的種種問題,也許理解的同學可能可以用一句話解釋清楚,但是不理解的同學再怎麼說也沒辦法理解.

下面通過幾個簡單的例子【體會】一下遞迴,先從【感性】的角度理解遞迴.

我們直到fibonacci數的遞推公式為:f(0)=f(1)=1,f(n)=f(n-1)+f(n-2) n>=2;

這個明顯地給出了遞迴邊界n=0或1的時候f(n)的值,和遞迴邏輯f(n)=f(n-1)+f(n-2),即遞推公式.所以這個遞迴函式不難書寫

#includeusing namespace std;  

int f(int n)//函式返回乙個數對應的fibonacci數

int main()

階乘的遞迴公式為:

給乙個陣列a:a[0],a[1],...,a[n-1]如何用遞迴的方式求和?

仍然是兩個問題:遞迴邊界和遞迴公式.

遞迴邊界是什麼?一時不容易想到,但是我們想到了求和,多個數的求和過程是什麼,x,y,z,w手動求和的過程是什麼?步驟如下:

x+y=a,任務變為a,z,w求和

a+z=b,任務變為b,w求和

b+w=c得出答案

思考一下,【得出答案】這一步為什麼就可以得出答案呢?(廢話?)是因為,乙個數不用相加就能得出答案.

所以,遞迴的邊界就是只有乙個數.

所以,遞迴邊界有了,那麼遞迴公式呢?其實手動計算過程中,隱含了遞迴公式:

其中+為求兩個數的和,f為求多個數的和的遞迴函式.**如下:

#includeusing namespace std;  

int f(int a,int start,int end)

int main()

; int s=0,e=4;

cout << f(a,s,e) << endl;

return 0;

}

手動求最大值的過程是什麼,遍歷+比較,過程如下:

例如,求3,2,6,7,2,4的最大值:先設定最大值max=-999999,然後將max和陣列元素逐個(遍歷)比較如果a[i]>max,則更新max的值為a[i],否則max不變,繼續向後遍歷,直到遍歷結束.

max<3,則max=3

max>2,max=3不變

max<6,則max=6

max<7,則max=7

max>2,max=7不變

max>4,max=7不變

遍歷結束,max=7為最大值.

和求和類似,遞迴的公式如下:

其中max為求兩個數的較大值函式,f為求多個數的最大值的遞迴函式.**如下:

#includeusing namespace std;  

#define max(a,b) (a>b?a:b)

int f(int a,int s,int e)

int main()

; int s = 0,e = 4;

cout << f(a,s,e) << endl;

return 0;

}

之所以,說上面的幾個例子是【簡單例子】,是因為上述所有的遞迴都屬於【單向遞迴】.單向遞迴,遞迴的路徑就是乙個方向,所以思路相對比較容易想到.

較難的遞迴問題,一般都不是單向遞迴,而是需要使用【回溯】的方法,遞迴的方法不太容易想到.

JS遞迴,幾個小例子教你秒懂遞迴

函式中用呼叫函式自己,此時就是遞迴,遞迴一定要有結束條件 function f1 f1 瀏覽器崩潰,因為沒有結束條件 死迴圈 改進如下 var i 0 function f1 console.log 從前有座山,山里有個廟,廟裡有個老和尚給小和尚講故事 f1 求n個數字的和 n 5 5 4 3 2 ...

幾個js的小例子

1 js的作用域,window物件 if a in window alert a 1 js的作用域是由函式劃分的 2 js的執行順序 var a 1,b function a x alert a 1 3 js引數 arguments 的含義 function b x,y,a b 1,2,3 10 4...

C 幾個好玩的小例子

這個感覺挺好的,輸入乙個年份,就能幫助你判斷是不是潤年,console.writeline 請輸入年份 string stryear console.readline 接收使用者輸入的內容 int year convert.toint32 stryear 將內容轉換為int型別的數字 bool re...