1. 程式人生 > >關於遞迴的一些看法(斐波那契數列問題)

關於遞迴的一些看法(斐波那契數列問題)

今天碰見個斐波那契數列問題(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)

注:上述都是先進入一個遞迴函式進行遞迴,若無法再次遞迴表明需要返回上層,遞迴時不會執行遞迴函式下面的函式,返回到的是設定的遞迴函式定義,直到需要返回上一層時才執行遞迴宣告下的函式後返回上一層;表明本層底櫃呼叫結束。