优化递归斐波那契方法。

时间:2014-10-29 14:25:57

标签: java recursion fibonacci

我正在尝试优化fibonacci recurisve方法,以便它不像递归方法那么慢。这些方法的参数必须如此。每当我运行它时,它不会给我我需要的结果。关于如何前进的任何建议都会有所帮助。

      public static long optimizedFib(int n)
      {
          long[] parameters = new long[3];
          for(int i =0; i < n;i++)
          {
             parameters[i] = 1;
          }
          return optimizedFib(n, parameters);
      }

public static long optimizedFib(int n, long[] parameters)
{
    if(n <= 2)
    {
        return 1;
    }
    else
    {   
    parameters[2] = parameters[1] + parameters[0];
    parameters[1] = parameters[0]; 
    parameters[0] = parameters[2];
    }
    return optimizedFib(n-1, parameters);
}

}

1 个答案:

答案 0 :(得分:1)

首先,你正在超越阵列的界限。您可以定义大小为3的数组:

long[] parameters = new long[3];

然后你迭代到n

for(int i =0; i < n;i++)
{
    parameters[i] = 1;
}

您还要将值初始化为1,这是不正确的。由于您只使用三个索引,并且我们只需要第一个索引为1,我们只需将第一个索引初始化为1(其余值将默认为0)。 / p>

public static long optimizedFib(int n)
{
    long[] parameters = new long[3];
    parameters[0]=1;
    return optimizedFib(n, parameters);
}

接下来,您的递归方法从未返回计算结果(它只返回1)。为了解决这个问题,我们递归调用optimizedFib,然后返回parameters[0]parameters[1]之和。

public static long optimizedFib(int n, long[] parameters)
{
    if(n <= 0){
        return 0;
    }
    if(n <= 2)
    {
        return 1;
    }
    else
    {
        parameters[2] = parameters[1] + parameters[0];
        parameters[1] = parameters[0];
        parameters[0] = parameters[2];
        optimizedFib(n-1, parameters);
        return parameters[0] + parameters[1];
    }
}

请注意,long时,您将溢出n > 92数据类型。

其他信息

此优化称为Memoization。您可以看到更多实现here。在我看来,有一个迭代的解决方案,有点容易理解:

public int fib(int n) {
    if (n < 2) {
        return n;
    }
    int[] f = new int[n+1];
    f[0] = 0;
    f[1] = 1;
    for(int i = 2;i<=n;i++) {
        f[i] = f[i-1] + f[i-2];
    }
    return f[n];
}

Source