#include<iostream>//f(n)=f(n-1)+f(n-2)递归-时间取代空间,慢 #include<bits/stdc++.h>using namespace std;int birth(int n){ if(n==1) return 1; if(n==2) return 1; else return birth(n-1)+birth(n-2);}int main(){ int n; cin >> n; cout << birth(n); return 0;
时间: 2025-04-03 14:10:43 浏览: 28
### 优化递归函数以降低时间复杂度
#### 动态规划方法
动态规划是一种有效的优化技术,可以显著减少重复计算。通过自底向上的方式构建解决方案并保存中间结果,从而避免了指数级的时间复杂度。这种方法的时间复杂度为 \(O(n)\),空间复杂度也为 \(O(n)\)[^1]。
以下是基于动态规划的 C++ 实现:
```cpp
#include <iostream>
using namespace std;
// 使用动态规划计算斐波那契数列
unsigned long long fibonacciDP(int n) {
if (n <= 1) return n;
unsigned long long fib[n + 1];
fib[0] = 0;
fib[1] = 1;
for (int i = 2; i <= n; ++i) {
fib[i] = fib[i - 1] + fib[i - 2]; // 存储每一步的结果
}
return fib[n];
}
int main() {
int n;
cout << "Enter a number: ";
cin >> n;
cout << "Fibonacci(" << n << ") = " << fibonacciDP(n) << endl;
return 0;
}
```
#### 尾递归优化
尾递归是指递归调用作为整个函数体中的最后一个操作执行的技术。编译器能够将其转换为迭代形式,从而避免堆栈溢出问题,并将时间复杂度保持在 \(O(n)\)[^1]。
下面是尾递归版本的实现:
```cpp
#include <iostream>
using namespace std;
// 尾递归实现斐波那契数列
unsigned long long tailRecursiveFib(int n, unsigned long long prev = 0, unsigned long long curr = 1) {
if (n == 0) return prev;
if (n == 1) return curr;
return tailRecursiveFib(n - 1, curr, prev + curr);
}
int main() {
int n;
cout << "Enter a number: ";
cin >> n;
cout << "Fibonacci(" << n << ") = " << tailRecursiveFib(n) << endl;
return 0;
}
```
#### 迭代方法
除了上述两种方法外,还可以采用简单的迭代算法来进一步节省内存开销。此方法仅需两个变量即可完成计算,因此其空间复杂度降为 \(O(1)\),而时间复杂度仍为 \(O(n)\)[^4]。
下面是一个典型的迭代实现:
```cpp
#include <iostream>
using namespace std;
// 迭代实现斐波那契数列
unsigned long long fibonacciIterative(int n) {
if (n <= 1) return n;
unsigned long long prev = 0, curr = 1;
for (int i = 2; i <= n; ++i) {
unsigned long long next = prev + curr;
prev = curr;
curr = next;
}
return curr;
}
int main() {
int n;
cout << "Enter a number: ";
cin >> n;
cout << "Fibonacci(" << n << ") = " << fibonacciIterative(n) << endl;
return 0;
}
```
以上三种方法均能有效解决传统递归带来的性能瓶颈问题。具体选择取决于实际需求以及对时间和空间效率的要求。
阅读全文
相关推荐








