我想将fib系列打印到1000以下。但是在下面的代码中,我不知道为什么直到我定义的数组的最大大小时才得到fib no?
int main(){int dp [22] = {0};
dp[0] = 0, dp[1] = 1;
count<<dp[0]<<" "<<dp[1]<<" ";
for(int i=2; dp[i]<=1000; i++){
dp[i] = dp[i-1] + dp[i-2];
cout<<dp[i]<<" ";
}
cout<<endl;
return 0;
}
期望的输出:0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987实际输出:0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 987 1597 2584 4181 6765 10946
问题是此行中的测试dp[i]<=1000
:
for(int i=2; dp[i]<=1000; i++){
i
的值是next数组元素的索引,该索引始终包含零,因此测试dp[i]<=1000
始终返回true。我不确定为什么在经过数组末尾时它不会引起一些内存错误。我想只是机会。
也许将for
循环重写为while
循环更清楚:
int i = 2;
while (dp[i] <= 1000) {
dp[i] = dp[i - 1] + dp[i - 2];
cout << dp[i] << " ";
i++;
}
使用for
循环使之工作的一种方法:
#include <iostream>
using namespace std;
int main() {
int dp[22] = {0};
dp[0] = 0;
dp[1] = 1;
cout << dp[0] << " " << dp[1] << " ";
for (int i = 2; ; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
if (dp[i] <= 1000) {
cout << dp[i] << " ";
} else {
break;
}
}
cout << endl;
return 0;
}