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

Trying to make a function that finds the Fibonacci number of a user input number

本文关键字:数字 输入 用户 查找 创建 函数 一个      更新时间:2023-10-16

我正在尝试制作一个程序,用户输入一个数字,然后将该数字输入到一个函数中,它输出该数字所在的斐波那契序列的元素。

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

变量"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;
}

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

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

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

您有一个主要问题,循环到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.