我正在尝试优化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);
}
}
答案 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];
}