试图创建一个函数来查找用户输入数字的斐波纳契数

时间:2015-03-25 23:58:08

标签: c++ function fibonacci

我正在尝试创建一个用户输入数字的程序,然后将该数字输入到函数中,并输出该数字所在的Fibonacci序列的元素。

它给了我一个错误,上面写着

  

围绕变量'堆叠?被腐蚀了

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

#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;
}

3 个答案:

答案 0 :(得分:0)

您只用一个元素定义fib,因此发生缓冲区溢出。要修复它,您可以使用动态内存分配。将fib定义为int*(指向int的指针)并使用fib=malloc(sizeof(int)*num);进行分配,并且不要忘记使用free(fib);发布。或者,如果您的编译器支持C99,则可以使用可变长度数组。

并且有一个不需要数组的更好的算法。因为Fib(n)仅依赖于Fib(n-1)和Fib(n-2),所以可以使用两个变量来存储Fib(n-1)和Fib(n-2),而不存储先前的元素。

答案 1 :(得分:0)

1堆栈损坏很可能是因为你的数组

int fib[] = { 0 }

你已经声明了一个大小为1的int数组,然后在访问超出数组边界的数据之后立即

fib[1] = fib[2] = 1;

对于Fibonacci序列,使用递归特别容易实现;

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);
  }

答案 2 :(得分:0)

你有一个主要问题,执行循环直到num - 1,你必须将它改为:

                            for (i = 3; i <= num; i++)
                            {
                                fib[i] = fib[i - 2] + fib[i - 1];
                            }

做完整的保证。也许你在初始化数组时遇到问题,你不必这样做,只需声明它:

                            int fib [num]; //the size is because num gonna be the last element of your array.