java优化递归斐波那契方法。
我正在尝试优化斐波那契递归方法,这样它就不会像递归方法那样慢。这些方法的参数必须如此。无论何时我运行它,它都不会给我所需的结果。任何关于如何前进的建议都会有所帮助
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 楼答案
首先,您正在吹过数组的边界。您可以定义大小为3的数组:
然后迭代到
n
您还将值初始化为
1
,这是不正确的。由于您只使用三个索引,并且我们只需要第一个索引为1
,因此我们可以简单地将第一个索引初始化为1
(其余的值将默认为0
)接下来,递归方法从未返回计算结果(它只返回
1
)。为了解决这个问题,我们递归调用optimizedFib
,然后返回parameters[0]
和parameters[1]
之和注意
n > 92
时long
数据类型将溢出强>补充资料
这种优化称为Memoization。您可以看到更多的实现here。在我看来,有一个迭代解决方案更容易探索:
Source