我必须在fibbonacci序列中找到第6个fibbonacci数。 fib(6)称为fib(4)和fib(5),首先是fib(5)。 fib(5)称为fib(4)和fib(3)并最终达到基础情况,并且计算fib(2),fib(3)fib(4)和最终fib(5)。当fib(5)计算时,fib(6)称为fib(4)。这次通过相同的过程f(2)f(3)并最终计算f(4)。但是如果我们可以在调用fiv(5)时为fiv(4)节省价值,那么当fiv(4)被调用时我们不需要再次计算。相反,当调用fiv(5)时,我们可以使用fiv(4)的保存值。我怎么能这样做
int fib(int n)
{
if(n==0)
return 0;
else if(n==1)
return 1;
return fib(n-1)+fib(n-2);
}
答案 0 :(得分:4)
您正在寻找的术语是" memoization。"这是一个非常标准的优化,Fibonacci序列实际上是教科书的例子。
答案 1 :(得分:4)
正如John Zwinck指出的那样,这个词是memoization。这意味着,在每一步中,我们都存储计算的中间值(因为递归调用很昂贵)。
考虑您的代码修改如下:
#include <iostream>
using namespace std;
int main()
{
int fibboA[10];
fibboA[0]=0; //1st Fibonacci number is always 0;
fibboA[1]=1; //2nd Fibonacci number is always 1;
cout<<fibboA[0]<<"\t"<<fibboA[1]<<"\t";
//3rd onwards, it is the sum of the previous 2;
for(int i=2;i<10;i++)
{
fibboA[i]=fibboA[i-1]+fibboA[i-2];
cout<<fibboA[i]<<"\t";
}
return 0;
}
在此代码中,我们将先前的值存储在数组fibboA[]
中,并使用先前存储的最新两个值(i-1
和i-2
)计算当前的斐波那契数(i
)。
希望这有用。
答案 2 :(得分:1)
通过一次计算两个Fibonacci数,您可以获得简单有效的(线性时间)递归解决方案。
void fib(int n, int& f1, int& f0)
{
if (n == 1)
{ f1= 1; f0= 0; }
else
{ fib(n - 1, f0, f1); f1+= f0; }
}
该函数返回Fn
和Fn-1
。注意参数的交换。
答案 3 :(得分:0)
#include <iostream>
using namespace std;
int ar[20];
int fib (int n)
{
if(n==0||n==1)
return n;
if(ar[n]!=-1)//check if ar[n] exists than just return values
return ar[n];
else
{
ar[n]= fib(n-1)+ fib(n-2);
return ar[n];
}
}
int main()
{
for(int i=0;i<20;i++)
ar[i]=-1;//initialise all to empty
cout<<fib(8);
}
答案 4 :(得分:0)
这是递归动态编程解决方案的另一个例子:
#include <vector>
#include <iostream>
int fib(int n, std::vector<int>& data) {
if (n >= 2) {
int& num = data[n - 2];
if (num) {
return num;
}
return (num = fib(n - 1, data) + fib(n - 2, data));
}
return n;
}
int fib(int n) {
if (n >= 2) {
std::vector<int> data(n - 1, 0);
return fib(n, data);
}
return n;
}
int main(int argc, char *argv[]) {
std::cout << fib(23) << std::endl;
return 0;
}