【发布时间】:2020-01-15 23:40:58
【问题描述】:
我正在尝试解决 Project Euler 上的2nd problem,我必须打印所有低于 400 万的偶数斐波那契数的总和。我正在使用以下代码,但程序没有返回任何值。当我用 10 之类的小东西替换 4000000 时,我得到了总和。这是否意味着我的程序耗时太长?我做错了什么?
#include <iostream>
using namespace std;
int fibonacci(int i) {
if (i == 2)
return 2;
else if (i == 1)
return 1;
else return fibonacci(i - 1) + fibonacci(i - 2);
}
int main() {
int currentTerm, sum = 0;
for (int i = 1; i <= 10; i++) {
currentTerm = fibonacci(i);
if (currentTerm % 2 == 0)
sum += currentTerm;
}
cout << sum;
return 0;
}
【问题讨论】:
-
尝试在此处使用
unsigned long long int代替int:int currentTerm, sum = 0;并从您的fibonacci函数返回unsigned long long int。 -
为什么你们都使用循环和递归?如果您循环 4000000 次,那么当
i具有更高的值时,您也会进行大量的递归(这意味着 4000000 次循环迭代,此外每次循环迭代还有大约 i 个递归调用) -
我的第一个猜测是堆栈溢出。您的斐波那契算法正在递归地使用堆栈进行计算。此外,当您重复相同的计算时,运行时复杂性是指数级的。我建议你找到一种方法来在线性时间内计算任何斐波那契数(不是那么难),然后在这个新算法中计算总和。
-
请注意,他的问题表明他只需要添加小于 400 万次的数字,而不是 小于 400 万次迭代