【发布时间】:2016-07-28 15:07:57
【问题描述】:
以下代码用于计算前 70 个斐波那契数。我有两个问题:
1) 为什么对于i 的每个连续值,程序变得越来越慢?
是不是因为调用大数的函数会占用大量内存。
2) 我可以使用什么技术或编码方案来加速程序在运行时的计算?
#include <iostream>
int fib(int n) {
if (n == 1 || n == 2) return 1;
return fib(n - 1) + fib(n - 2);
}
void main() {
for (int i = 1; i<70; i++)
cout << " fib(" << i << ") = " << fib(i) << endl;
}
【问题讨论】:
-
这主要是因为递归调用 fib() 函数的堆栈操作而变慢。
-
存储上一次计算的结果,并在下一次计算中使用。每次循环时,您都在重新计算中间 fib' 系列,
-
创建一个循环来计算数字并输出它。
-
Here 是您的代码的一个版本(由于时间原因有一个下限),它输出每次计算中的函数调用次数。
fib(30)需要超过一百万次函数调用。 -
实际上尝试在 32 位整数中计算第 70 个斐波那契并没有多大意义。大约 47 个之后会溢出。
标签: c++ recursion optimization runtime fibonacci