不使用迭代重新解决这个问题
时间: 2024-09-21 20:07:38 浏览: 46
迭代法-穿越沙漠问题 迭代法-穿越沙漠问题
5星 · 资源好评率100%
如果不想使用迭代,我们可以改用动态规划和矩阵乘法的方式,这种做法适合用于计算大的斐波那契数,因为它的时间复杂度为O(logn),而不是递归的O(2^n)。以下是使用矩阵乘法的C++代码实现:
```cpp
#include <iostream>
#include <vector>
using namespace std;
// 定义矩阵乘法函数
vector<vector<long long>> multiply(vector<vector<long long>>& A, vector<vector<long long>>& B) {
int rowsA = A.size(), colsB = B[0].size();
vector<vector<long long>> C(rowsA, vector<long long>(colsB, 0));
for (int i = 0; i < rowsA; ++i) {
for (int j = 0; j < colsB; ++j) {
for (int k = 0; k < A[0].size(); ++k) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
return C;
}
// 计算斐波那契数的矩阵形式
vector<vector<long long>> powerMatrix(vector<vector<long long>>& M, long long exponent) {
if (exponent == 1)
return M;
vector<vector<long long>> half = powerMatrix(M, exponent / 2);
if (exponent % 2 == 0)
return multiply(half, half);
else
return multiply(multiply(half, half), M);
}
long long fibonacci(int n) {
if (n <= 0) return 0;
vector<vector<long long>> matrix = {{1, 1}, {1, 0}};
vector<vector<long long>> result = powerMatrix(matrix, n - 1); // 减一是因为我们要从0开始计数
return result[0][0];
}
int main() {
int a;
cout << "请输入一个正整数: ";
cin >> a;
long long result = fibonacci(a);
cout << "斐波那契数列中第 " << a << " 个数是: " << result << endl;
return 0;
}
```
这段代码首先定义了一个矩阵乘法的辅助函数,然后利用矩阵快速幂的思想计算斐波那契数列的第n项。这种方法避免了递归带来的大量重复计算,提高了效率。
阅读全文