C++ 尝试创建一个函数,用于查找用户输入数字的斐波那契数

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]

我试图制作一个程序,用户输入一个数字,然后这个数字被输入到一个函数中,它输出斐波那契序列的元素,这个数字就是

它给了我一个错误,说

变量“fib”周围的堆栈已损坏

我不知道这是逻辑错误还是程序错误。我也不知道我找到斐波那契数的逻辑是否正确

#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.