使用数组和指针的斐波那契系列

Fibonacci series using array and pointer

本文关键字:系列 数组 指针      更新时间:2023-10-16

以下程序应该打印到给定术语的fibonacci编号:

#include <iostream>
#include <string>
using namespace std;
int* fibo(int);
int main()
{
    int num,  *ptr;
    cout << "How many numbers in fibonacci series? ";
    cin >> num;
    ptr = fibo(num);
    for (int i = 0; i < num; i++)
    {
        cout << *(ptr + i) << " ";
    }
}
int* fibo(int n)
{
    int arr[50];
    arr[0] = 1;
    arr[1] = 1;
    for (int i = 2; i < n; i++)
    {
        arr[i] = arr[i - 1] + arr[i - 2];
    }
    return arr;
}

但行不通。斐波那契系列的前两个要素才正确打印。

您必须将ARR更改为指针。

int *arr =new int(50);

因为您创建ARR的方式正在创建局部变量。局部变量在函数或类别存在之后被破坏。因此,在Fibo功能之后您无法保留该地址以使其之后到达ARR。

当前,您正在将fibo退出后不再存在的数组返回一个指针。您需要使用动态内存分配

使数组持续持续
 int* fibo(int n)
 {
   int* arr = new int[n]; // use n here because your loop does too!!
   arr[0] = 1;
   arr[1] = 1;
   for (int i = 2; i < n; i++)
   {
     arr[i] = arr[i - 1] + arr[i - 2];
   }
   return arr;
 }

现在arr指向堆上的整数数组,因此,如果 fibo()退出,则可以安全地访问。因为它是持久的,所以您需要在完成后释放内存,因此您还必须致电

delete[] ptr;

在退出之前,在main()中循环后。您应该看一下std::vector做这种事情(除非这是课堂练习,并且被告知您不要这样做)

您使用的算法是正确的,但是您的C代码不正确。在您的Fibo函数中,您创建一个自动分配的数组(在堆栈上分配),这意味着该数组将在函数达到其末端后立即删除。这解释了为什么值未正确显示。

如果要更正,那么将您的数组分配在主体中,然后将该数组的指针传递给您的纤维功能?然后,您只需修改Fibo函数中的数组,而不是将指针返回到一个数组。

int main(int argc, char * argv[]){
    int arr[50];
    // (...)
    fibo(num, arr);
}
void fibo(int arr[50], int num){
    // (...)
}

此解决方案对其他解决方案的主要优点(包括在纤维函数内动态分配数组的组成)是:

  • 您不必担心内存分配。
  • 堆栈分配总是比堆分配更有效。