斐波那契数 - 动态数组

Fibonacci numbers - dynamic array

本文关键字:动态 数组      更新时间:2023-10-16

我想编写斐波那契数程序,在函数中使用动态数组。如果我想在函数中初始化数组,我必须在哪里删除这个数组?这是代码:

#include <iostream>
using namespace std;
int* fibo(int);
int main()
{
    int *fibonacci, n;
    cout << "Enter how many fibonacci numbers you want to print: ";
    cin >> n;
    fibonacci = fibo(n);
    for (int i = 0; i<n; i++)
        cout << fibonacci[i] << " ";
    //for (int i = 0; i < n; i++)
        //delete w_fibo[i];
    //delete[] w_fibo;
    return 0;
}
int* fibo(int n)
{
    int* w_fibo = new int[n];
    if (n >= 0)
        w_fibo[0] = 1;
    if (n >= 1)
        w_fibo[1] = 1;
    for (int i = 1; i < n; i++)
        w_fibo[i + 1] = w_fibo[i] + w_fibo[i - 1];
    return w_fibo;
}

您不必初始化数组! 更好的动态斐波那契表示可能是这样的:

int fib2 (int n) {
int i = 1, j = 0;
    for (int k = 0; k < n; k++) { // The loop begins to work real after one loop (k == 1). Sounds interesting!
    j += i;                   // Adds the produced number to the last member of the sequence and makes a new sentence.
    i = j - i;                // Produces the number that should be added to the sequence.
    }
return j;
}

您可以使用此方法获取第 n 个 FIB 号码。它是O(log(n)),所以它非常高效。

int fib3 (int n) {
int i = 1, j = 0, k = 0, h = 1, t=0;     
while (n > 0) {
    if (n % 2) {                                        //  |
        t = j * h;                                      //  |
        j = i * h + j * k + t;
        i = i * k + t;
    }
    t = h * h;
    h = 2 * k * h + t;
    k = k * k + t;
    n /= 2;
    }
   return j;
}
如果在

fibo() 内部分配一个std::vector<int>并保留足够的内存,然后按值返回它,则内存分配将由编译器负责:

#include <iostream>
#include <vector>
using namespace std;
std::vector<int> fibo(int n)
{
    std::vector<int> w_fibo;
    w_fibo.reserve(n);
    if (n >= 0)
        w_fibo[0] = 1;
    if (n >= 1)
        w_fibo[1] = 1;
    for (int i = 1; i < n; i++)
        w_fibo[i + 1] = w_fibo[i] + w_fibo[i - 1];
    return w_fibo;
}
int main()
{    
    int n = 10;
    std::vector<int> fibonacci = fibo(n);
    for (int i = 0; i<n; i++)
        cout << fibonacci[i] << " ";
}

活生生的例子

注意:这可以保证避免在 C++11(移动语义)中不必要地复制,并且很可能在 C++98(使用返回值优化的复制省略)中这样做。

这是一个古老的问题,但以防万一有人碰巧路过这可能会有所帮助。

如果你需要一个有效的方法来获得第n个斐波那契数,我们有一个O(1)时间复杂度过程。

它基于比奈的公式,我认为我们在 math.se 的朋友会更好地证明,所以请随时点击该链接。

公式本身是,给定 a=1.618 和 b=-0.618(这些是近似值)

第 n 项是 (a^n - b^n)/2.236。四舍五入的一个好方法(因为我们使用的是近似值)是加 0.5 并采用地板函数。

math.floor(((math.pow(1.618,n)-math.pow(-0.618,n))/2.236 + 0.5)