优化以下递归函数

时间:2019-10-11 03:53:45

标签: c

试图解决分配问题...

我得到的信息是:

foo(0)=0
foo(1)=1
foo(2)=2

下面的代码最多可以处理30个数字...但是它需要流畅地工作到100个数字,因此我需要对其进行优化。我试图创建一个将每个连续数字联系起来的方程式,但是它不起作用。有什么想法如何优化它吗?

#include <stdio.h>
#include<stdlib.h>

long foo(int n) {
  long a;
  if (n==0)
  {
    return 0;
  }
  else if(n==1)
  {
    return 1;
  }
  else if(n==2)
  {
    return 2;
  }

  else
  {
   return foo(n-1)-2*foo(n-2)+foo(n-3)-2;
  }
}

int main(void) {

  long b=foo(7);

  printf("%ld",b);
}

1 个答案:

答案 0 :(得分:2)

对于这样一个简单的问题,您可以使函数迭代。

#include <stdint.h>

uint64_t foo (int n)
{
    if (n == 0)
        return 0;
    else if (n == 1)
        return 1;
    else if (n == 2)
        return 2;
    else
    {
        uint64_t a = 0, b = 1, c = 2;
        uint64_t ret;
        for (int i = 2; i<n; i++)
        {
            ret = a + 2*b + c - 2;
            a = b;
            b = c;
            c = ret;
        }
        return (ret);
    }
}

如果必须使用递归,则可以通过备忘录显着提高运行时间。在这种情况下,您需要一个额外的数组来存储已经计算出的值的结果。

uint64_t memo[101];  // size this array to the maximum value of n needed to be calculated.

uint64_t foo(int n) {
  uint64_t a;
  if (n==0)
  {
    return 0;
  }
  else if(n==1)
  {
    return 1;
  }
  else if(n==2)
  {
    return 2;
  }

  else
  {
    if (memo[n] == 0)
    {
        a = foo(n-1)-2*foo(n-2)+foo(n-3)-2;
        memo[n] = a;
    }
    else
    {
        a = memo[n];
    }
    return a;    
  }
}