自学内容网 自学内容网

C++|斐波那契数列

斐波那契数列是一个非常著名的数列,它的定义如下:

  • ( F(0) = 0 )
  • ( F(1) = 1 )
  • ( F(n) = F(n-1) + F(n-2) ) 对于 ( n \geq 2 )

这个数列的前几项是:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …

斐波那契数列可以通过多种方法计算,包括递归、迭代和动态规划。下面我将提供几种不同的实现方式:

1. 递归实现(不推荐,效率低下)

递归是实现斐波那契数列的直观方法,但是它的时间复杂度是指数级的,因为有很多重复计算。

#include <iostream>

int fibonacci(int n) {
    if (n <= 1) return n;
    return fibonacci(n - 1) + fibonacci(n - 2);
}

int main() {
    int n;
    std::cin >> n;
    std::cout << fibonacci(n) << std::endl;
    return 0;
}

2. 迭代实现

迭代方法的时间复杂度是线性的,空间复杂度也是线性的,因为它只需要存储前两个数。

#include <iostream>

int fibonacci(int n) {
    if (n <= 1) return n;
    int a = 0, b = 1, c;
    for (int i = 2; i <= n; ++i) {
        c = a + b;
        a = b;
        b = c;
    }
    return b;
}

int main() {
    int n;
    std::cin >> n;
    std::cout << fibonacci(n) << std::endl;
    return 0;
}

3. 动态规划(空间优化)

动态规划方法与迭代方法类似,但是可以进一步优化空间复杂度到常数级别。

#include <iostream>

int fibonacci(int n) {
    if (n <= 1) return n;
    int a = 0, b = 1;
    for (int i = 2; i <= n; ++i) {
        int c = a + b;
        a = b;
        b = c;
    }
    return b;
}

int main() {
    int n;
    std::cin >> n;
    std::cout << fibonacci(n) << std::endl;
    return 0;
}

4. 矩阵快速幂方法(高级)

斐波那契数列还可以通过矩阵快速幂方法来计算,这种方法的时间复杂度是 ( O(\log n) )。

#include <iostream>
#include <vector>

using namespace std;

typedef long long ll;

// 矩阵乘法
vector<vector<ll>> multiply(const vector<vector<ll>>& a, const vector<vector<ll>>& b) {
    vector<vector<ll>> result(2, vector<ll>(2, 0));
    for (int i = 0; i < 2; ++i) {
        for (int j = 0; j < 2; ++j) {
            for (int k = 0; k < 2; ++k) {
                result[i][j] += a[i][k] * b[k][j];
            }
        }
    }
    return result;
}

// 矩阵快速幂
vector<vector<ll>> power(vector<vector<ll>> base, ll exponent) {
    vector<vector<ll>> result = {{1, 0}, {0, 1}};
    while (exponent > 0) {
        if (exponent % 2 == 1) {
            result = multiply(result, base);
        }
        base = multiply(base, base);
        exponent /= 2;
    }
    return result;
}

ll fibonacci(int n) {
    if (n <= 1) return n;
    vector<vector<ll>> base = {{1, 1}, {1, 0}};
    vector<vector<ll>> result = power(base, n - 1);
    return result[0][0];
}

int main() {
    int n;
    std::cin >> n;
    std::cout << fibonacci(n) << std::endl;
    return 0;
}

这些方法展示了如何计算斐波那契数列的不同方式,从简单的递归到高效的矩阵快速幂方法。您可以根据需要选择合适的方法。


原文地址:https://blog.csdn.net/weixin_42964413/article/details/143481845

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!