關於遞迴的一些看法(斐波那契數列問題)
今天碰見個斐波那契數列問題(Fibonacci ),使用了遞迴呼叫的思想,程式碼如下圖所示:
遞迴和非遞迴分別實現求第n個斐波那契數 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int FibonacciSequence(int n) { if (n == 1 || n == 2) { return 1; } return FibonacciSequence(n - 1) + FibonacciSequence(n - 2); } int main() { int n = 0; scanf("%d",&n); printf("%d\n", FibonacciSequence(n)); system("pause"); return 0; }
遞迴的思想就是大事化小的思想;
本題中的斐波那契數列通過查詢百度可知其數列為:1,1,2,3,5,8,13,21,34,55....
從上可以看出第N個數其為前兩個數的和,但又兩個意外,即第一個和第二個數為1,所以我們寫程式碼的時候一定要注意這個特殊情況;
數列為1,1,2,3,5,8...n
數列可以視為1,1,2,3,5,8...n-1,n的問題,將數列分為兩個部分進行分析
也可視為1,1,2,3,5,8.., n-3,n-2, n-1,n 的問題
則上述就是本題的解題思路,大事化小,一直化解到特殊情況處結束。
所以我才用了遞迴n-1,n-2兩個引數代表所有情況的出現
上述程式碼的關鍵是遞迴函式的呼叫問題:
int FibonacciSequence(int n) {
if (n == 1 || n == 2) {
return 1;
}
return FibonacciSequence(n - 1) + FibonacciSequence(n - 2);
}
第一次進入遞迴函式先進行if語句的判斷,在進行return 一行的函式判斷;(注:設定n為4)
這一行中有兩個遞迴函式,先判斷第一個函式FibonacciSequence(n - 1);
進入FibonacciSequence(n - 1)函式體,根據遞迴函式呼叫規則,呼叫其定義(FibonacciSequence(n - 1) 在這裡相當於宣告)
int FibonacciSequence(int n) {
if (n == 1 || n == 2) {
return 1;
}
此時n被宣告函式變為了(n-1=3),if判斷不成立;繼續該遞迴迴圈,(n-1 = 2)判定if迴圈成立,返回值1;再次遞迴(n-1 = 1)得到返回值1;故根據n = 3是n=1和n=2的上層語句可以得到n=3時,返回值為2;(底層的返回值相加得到上層的返回值)退出第一個遞迴語句,n返回其最上層,即n變回了4;然後進入第二個遞迴語句FibonacciSequence(n - 2);(第一個遞迴語句的退出條件為其已無遞迴下去的必要)
當進入第二條遞迴語句時,其(n-2 = 2)進入if語句判斷成立返回值為1,表明此時n = 2 的返回值為1與上述一致(不必相加);
而之後該語句無法再次遞迴,表明n = 4時,其返回值總共為 2 + 1 為 3 ;(n-1 = 3 時返回值為2,n-2的返回值為1)
注:上述都是先進入一個遞迴函式進行遞迴,若無法再次遞迴表明需要返回上層,遞迴時不會執行遞迴函式下面的函式,返回到的是設定的遞迴函式定義,直到需要返回上一層時才執行遞迴宣告下的函式後返回上一層;表明本層底櫃呼叫結束。