📅  最后修改于: 2023-12-03 15:00:44.980000             🧑  作者: Mango
Fibonacci数列是一个非常经典的数列,它的定义如下:
F(0) = 0
F(1) = 1
F(n) = F(n-1) + F(n-2) (n>=2)
即第n个数等于前两个数之和。在计算机科学中,Fibonacci数列经常被用于算法和编程练习中。
递归实现是最直观的方式。代码如下:
int fibonacci(int n) {
if (n == 0 || n == 1) {
return n;
} else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
递归实现有一个致命的问题:时间复杂度太高了。每次调用函数,都要进行一次函数调用的开销。这使得当n比较大时,程序会变得非常慢。
迭代实现是一种效率更高的实现方式。代码如下:
int fibonacci(int n) {
if (n == 0) {
return 0;
}
int a = 0;
int b = 1;
for (int i = 2; i <= n; i++) {
int c = a + b;
a = b;
b = c;
}
return b;
}
除了常规的递归和迭代实现方式外,还有一种通过黄金分割比例来求解Fibonacci数列的方式。这种方式在一些教材和编程练习中也被广泛使用。
代码如下:
double golden_fibonacci(double n) {
double golden = (1 + std::sqrt(5)) / 2;
return std::round(std::pow(golden, n) / std::sqrt(5));
}
这个方法的本质是利用了phi的特征方程求解Fibonacci数列的通项公式。
对于递归实现,时间复杂度为O(2^n);对于迭代实现,时间复杂度为O(n),空间复杂度为O(1)。
相比之下,迭代实现的时间和空间效率都更高。
Fibonacci数列的计算方法有很多种。在实际编程中,我们应该根据具体需求选择最合适的实现方式。