斐波那契數列各種方法求解

斐波那契數列各種方法求解

斐波那契數列(Fibonacci sequence)是指這樣一組數字:1、1、2、3、5、 8、 13······,可以由遞推公式F(n) = F(n-1)+F(n-2)得出,其初始值爲:F(1) = 1, F(2) = (1) 。
在刷題的過程中,遇到了許多關於斐波那契數列變形的題目,所以在這裏總結一下關於該數列的各種求解方法。

方法一:遞歸求解

主要是利用的斐波那契數列的遞推公式實現。

int fibonacci(int n)
{
	if(n <= 1)
		return n;
	return fibonacci(n-1)+fibonacci(n-2);
}
複雜度分析

時間複雜度:O(2^n)。
空間複雜度:O(n)。

方法二:正向求解

上述遞歸方法中,採用的是從n開始遞歸向前求解,這裏可以選用正向求解的方法,一次計算F(1),F(2),F(3),F(4),······直到F(n)。

int fibonacci(int n)
{
	if(n <= 1)
		return n;
	int f1 = 0;
	int f2 = 1;
	int res;
	for(int i = 1; i < n; i++)
	{
		res = f1 + f2;
		f1 = f2;
		f2 = res;
	}
	return res;
}
複雜度分析

時間複雜度:O(n)。
空間複雜度:O(1)。

方法三:公式求解

斐波那契的通項公式爲:
F(n)=15[(1+52)n(152)n]. F(n) = \frac {1} {\sqrt{ 5}}[( \frac {1+\sqrt{ 5}}{2})^{n}-( \frac {1-\sqrt{ 5}}{2})^{n}].

int fibonacci(int n)
{
	if(n <= 1)
		return n;
	double sqrt_5 = sqrt(5);
	return (1 / sqrt_5) * (pow((1 + sqrt_5)/2,n+1) - pow((1 - sqrt_5)/2, n + 1));  
}
複雜度分析

時間複雜度:O(log(n)),因爲上述公式中用到了pow 函數,故需要 log(n) 的時間。
空間複雜度:O(1)。

方法四:動態規劃法

該問題也可以利用動態規劃的方法進行求解。
斐波那契的第i個數據爲第i-1個數與第i-2個數之和,令dp[i]表示第i個數據的值,則有:
dp[i]=dp[i1]+dp[i2]. dp[i] = dp[i-1] +dp[i-2].
初始值爲:dp[[1]] = 1, dp[[2]]= 1;

int fibonacci(int n)
{
	vector<int> dp(n+1);
	dp[1] = 1;
	dp[2] = 1;
	for(int i = 3; i <= n; i++)
	{
		dp[i] = dp[i-1] + dp[i-2];
	}
	return dp[n];
}

這個方法與正向求解方法其實本質上是一致的。但在空間複雜度上是不一樣的。

複雜度分析

時間複雜度:O(n)。
空間複雜度:O(n),動態數組dp需要n的空間。

-----------------------------------------------------------------------------------------
還有一些方法之後補充

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章