我想在函数中使用动态数组编写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;
}
答案 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] << " ";
}
注意:这可以保证避免在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)