從斐波那契數列了解遞歸

斐波那契數列:

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …
如果設F(n)爲該數列的第n項(n>=3),那麼這句話可以寫成如下形式:
F(n)=F(n-1)+F(n-2)

問題がある:給定一個整數n,如何去求F(n)?

由上面的式子可知:當n>=3的時候該式子成立,那當n=1或n=2的時候呢?

由上面的數列可知:F(1) = 1,F(2) = 2。這就是臨界條件。
假設n=5,那麼該過程可以這麼表達:

F(5) = F(4) + F(3) - - - <1>

先進行F(5)中F(4)的計算(能理解嗎?)

F(4) = F(3) + F(2) - - - <2>

先進行F(4)中F(3)的計算(同理)

F(3) = F(2) + F(1)

由上可得F(3) = 2,返回到<2>中:

F(4) = 2 + F(2)

同理可得F(4) = 3,返回到<1>中:

F(5) = 3 +F(3)

然後計算F(3)的計算

F(3) = F(2) + F(1)

由上可得F(3) = 2

最後求得F(5) = 5

由於F(1)和F(2)是這個遞歸的邊界,所以在到達邊界之前遞歸會一直進行。
只有當遇到邊界的時候,得到邊界的值後,纔會進行回溯

總結

遞歸的過程就是不斷地進行遞歸及到達邊界後回溯的過程

遞歸還有一個經典的例題:爬樓梯
在這裏插入圖片描述

問題:小明爬樓梯,一次可以上一個或兩個臺階,請問上到第N個臺階一共有幾種走法?

圖中一共有6個臺階,根據小明的走法,他會從那裏走到第六個臺階呢?
不錯,他只可能從第五個或者第四個上來。重複剛纔的問題,你會發現問題會變成:小明走到第二個臺階有幾種方法?顯然有兩種方法:一步兩個,一步一個,兩次上去。
小明走到第一個臺階顯然只有一種方法,那麼邊界就顯而易見了:

F(1) = 1 ,F(2) = 2 且F(n)=F(n-1)+F(n-2) (n>=3)

代碼:

#include <cstdio>
int digui(int c)//層數
{
	//這兩個就是邊界條件
	if(c == 1)return 1;
	if(c == 2)return 2;
	//如果不到邊界就接着向下遞歸
	return digui(c-1) + digui(c-2);//先進行c-1層的計算
}
int main()
{
	int i;
	scanf("%d",&n);
	printf("%d",digui(n));
	return 0;
}

順便說一下:int函數會返回一個整型數字,double函數會返回一個double值,void函數不返回值這裏就返回了到達某一層的方法數量

總結:

遞歸有兩個注意事項邊界如何向下遞歸(需要根據具體進行分析)

在這裏留一個問題:

根據我分析斐波那契數列的過程來看,遞歸函數有什麼缺點?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章