exam03-fibonacci數列

斐波那契數列(Fibonacci Sequence),又稱黃金分割數列,指的是這樣一個數列:1、1、2、3、5、8、13、21、……。在數學上,斐波納契數列以遞推的方法定義爲:
F(1)=1,
F(2)=1,
F(n)=F(n-1)+F(n-2)(n≥2,n∈N)。計算斐波那契數列第n項的值。

在這裏插入代碼片
#include <iostream>
#include <iomanip>
using namespace std;
double fib(int n) {
	double f = 0.0, g = 1.0;
	while(n--) {
		g += f;  
		f = g - f; 
	}     
	return f;
}
int main() {
    int n;
    cin >> n;
    cout <<setiosflags(ios::fixed)<<setprecision(0)<< fib(n) << endl;
	return 0;
}

時間複雜度:O(n)

改進Fibonacci數列
1.遞歸
public class Solution {
public int Fibonacci(int n) {
if(n<=1) return n;
return Fibonacci(n-1)+Fibonacci(n-2);
}
}
當n越大時,耗時越長,因爲有大量冗餘操作
舉個栗子:
n=4:
Fibonacci(4) = Fibonacci(3) + Fibonacci(2);
= Fibonacci(2) + Fibonacci(1) + Fibonacci(1) + Fibonacci(0);
= Fibonacci(1) + Fibonacci(0) + Fibonacci(1) + Fibonacci(1) + Fibonacci(0);
可以看到n=4的情況下Fibonacci(1)重複計算次數就已經高達3次

2.迭代
空間代價換取時間
public class Solution {
public int Fibonacci(int n) {
if(n<=1)
return n;
int a0=0,a1=1,a=1;
for(int i=1;i<n;i++){
a=a0+a1;
a0=a1;
a1=a;
}
return a;
}
}
3.動態規劃
時間空間上性能都比較好
class Solution {
public:
int Fibonacci(int n) {
int f = 0, g = 1;
while(n–) {
g += f;
f = g - f;
}
return f;
}
};

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