📜  fibonacci - C++ (1)

📅  最后修改于: 2023-12-03 15:00:44.980000             🧑  作者: Mango

Fibonacci - C++

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数列的计算方法有很多种。在实际编程中,我们应该根据具体需求选择最合适的实现方式。