斐波那契數列:
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函數不返回值這裏就返回了到達某一層的方法數量
總結:
遞歸有兩個注意事項邊界和如何向下遞歸(需要根據具體進行分析)
在這裏留一個問題:
根據我分析斐波那契數列的過程來看,遞歸函數有什麼缺點?