斐波纳契数 - 动态数组

时间:2014-02-08 19:07:58

标签: c++ arrays dynamic fibonacci

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

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

3 个答案:

答案 0 :(得分:1)

如果在std::vector<int>内分配fibo()并保留足够的内存,然后按值返回,则编译器将为您完成内存分配:

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

Live Example

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

答案 1 :(得分:1)

您不必初始化阵列!一个更好的动态Fibonacci演示可能是这样的:

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

答案 2 :(得分:0)

这是一个老问题,但万一有人碰巧通过,这可能会有所帮助。

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

它基于Binet's formula,我认为我们在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)