C++ 尝试创建一个函数,用于查找用户输入数字的斐波那契数
我试图制作一个程序,用户输入一个数字,然后这个数字被输入到一个函数中,它输出斐波那契序列的元素,这个数字就是 它给了我一个错误,说 变量“fib”周围的堆栈已损坏 我不知道这是逻辑错误还是程序错误。我也不知道我找到斐波那契数的逻辑是否正确C++ 尝试创建一个函数,用于查找用户输入数字的斐波那契数,c++,function,fibonacci,C++,Function,Fibonacci,我试图制作一个程序,用户输入一个数字,然后这个数字被输入到一个函数中,它输出斐波那契序列的元素,这个数字就是 它给了我一个错误,说 变量“fib”周围的堆栈已损坏 我不知道这是逻辑错误还是程序错误。我也不知道我找到斐波那契数的逻辑是否正确 #include <iostream> using namespace std; int Fibonacci(int num) { int fib[] = { 0 }, answer, i = 3; fib[1] = fib[2]
#include <iostream>
using namespace std;
int Fibonacci(int num)
{
int fib[] = { 0 }, answer, i = 3;
fib[1] = fib[2] = 1;
fib[0] = 0;
for (i = 3; i < num; i++)
{
fib[i] = fib[i - 2] + fib[i - 1];
}
answer = fib[num];
return answer;
}
int main()
{
int user_number, i = 0;
cin >> user_number;
cout << Fibonacci(user_number) << endl;
return 0;
}
您只使用一个元素定义了fib,因此会发生缓冲区溢出。要解决此问题,可以使用动态内存分配。将fib定义为指向int的int*指针,并使用fib=mallocsizeofint*num;进行分配;,别忘了用freefib;发布;。或者,如果编译器支持C99,则可以使用可变长度数组
还有一种更好的算法,它不需要数组。因为Fibn只依赖于Fibn-1和Fibn-2,所以可以使用两个变量来存储Fibn-1和Fibn-2,而不存储以前的元素。1堆栈损坏最有可能是因为您的数组
int fib[] = { 0 }
您已经声明了一个大小为1的int数组,然后在访问超出数组边界的数据之后立即声明
fib[1] = fib[2] = 1;
至于斐波那契序列,它特别容易用递归实现
int Fib(int var)
{
if (var < 1)
{
return 0;
}
else if (var == 1 || var == 2)
{
return 1;
}
else
{
return Fib(var-2)+Fib(var-1);
}
您有一个主要问题,在num-1之前循环,您必须将其更改为:
for (i = 3; i <= num; i++)
{
fib[i] = fib[i - 2] + fib[i - 1];
}
表达式int fib[]={0}要么声明一个1元素的数组,要么是未定义的行为。问题是编译器不知道要初始化多少个元素。如果我不知道用户将要输入的数字,我应该创建多大的数组?添加了一些标点符号,并从代码片段中删除了一些空行,因此占用的垂直空间更少。我尝试了int'int fib[99999];'但它仍然给了我错误。如果我不知道用户需要多少个数字,我如何声明集合中的元素数?可以使用递归实现,但使用大变量会很慢。如果您关心的是使用模板实现的速度,那么工作将在编译时完成,在运行时只留下静态查找
int fib [num]; //the size is because num gonna be the last element of your array.