为什么我得到的斐波那契数不超过数组的大小?
Why am I getting fibonacci numbers up to the size of my array?
我想打印 1000 以下的斐波那契数列。但是在我下面的代码中,我不知道为什么我得到的斐波那契数达到了我定义的数组的最大大小?
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;
}
Expected Output : 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
Actual Output : 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946
问题是测试dp[i]<=1000
这一行:
for(int i=2; dp[i]<=1000; i++){
i
的值是下一个数组元素的索引,它总是包含零,所以测试dp[i]<=1000
总是returns 真。我不确定为什么当你越过数组末尾时它不会导致一些内存错误。只是偶然,我猜。
也许 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;
}
您应该像这样重写您的内部循环以使其正常工作:
for(int i=2; /* dp[i]<=1000 */; i++){
dp[i] = dp[i-1] + dp[i-2];
if( dp[i] > 1000 ) break; // <<---- add this line
cout<<dp[i]<<" ";
}
实际上,我不太明白为什么您需要一个数组来打印数字,此代码无需任何数组即可打印:
int main()
{
int a = 0, b = 1, c;
while( a < 1000 ) {
std::cout << a << " ";
c = a + b;
a = b;
b = c;
}
std::cout << std::endl;
return 0;
}
我想打印 1000 以下的斐波那契数列。但是在我下面的代码中,我不知道为什么我得到的斐波那契数达到了我定义的数组的最大大小?
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;
}
Expected Output : 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
Actual Output : 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946
问题是测试dp[i]<=1000
这一行:
for(int i=2; dp[i]<=1000; i++){
i
的值是下一个数组元素的索引,它总是包含零,所以测试dp[i]<=1000
总是returns 真。我不确定为什么当你越过数组末尾时它不会导致一些内存错误。只是偶然,我猜。
也许 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;
}
您应该像这样重写您的内部循环以使其正常工作:
for(int i=2; /* dp[i]<=1000 */; i++){
dp[i] = dp[i-1] + dp[i-2];
if( dp[i] > 1000 ) break; // <<---- add this line
cout<<dp[i]<<" ";
}
实际上,我不太明白为什么您需要一个数组来打印数字,此代码无需任何数组即可打印:
int main()
{
int a = 0, b = 1, c;
while( a < 1000 ) {
std::cout << a << " ";
c = a + b;
a = b;
b = c;
}
std::cout << std::endl;
return 0;
}