如何使递归函数执行得更快

时间:2016-05-05 13:13:49

标签: c++ recursion

我必须在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)的保存值。我怎么能这样做

enter image description here

int fib(int n)
{
    if(n==0)
         return 0;
    else if(n==1)
            return 1;
    return fib(n-1)+fib(n-2);
}

5 个答案:

答案 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-1i-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; }
}

该函数返回FnFn-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;
}