我尝试记忆一个递归的斐波那契方法,它返回正确的数字。但是,它似乎没有比以前更快。我以为这是因为我没有正确利用数组来跟踪,而我仍在进行冗余调用。您能告诉我要进行哪些更改,以便我可以正确使用它吗?
不确定是否重要,但是fibIndex[]
在全局区域中声明,并在获取输入后在main方法中设置为[index + 1]的长度。
public static BigInteger fibRec(int index)
{
BigInteger results;
if (index <= 2)
{
results = BigInteger.ONE;
}
else
{
if (fibIndex[index] != null)
{
results = fibIndex[index];
}
else
{
results = fibRec(index - 1).add(fibRec(index - 2));
}
}
return results;
}
答案 0 :(得分:4)
它的运行速度不快,因为您实际上没有在使用 记忆,即您没有将结果放入数组中。如果您不这样做,那么您的实现实际上会变慢,因为您一直在检查从未真正记忆的记忆结果。这就是您需要做的。
public static BigInteger fibRec(int index) {
if (index <= 2) return BigInteger.ONE;
BigInteger result = fibIndex[index];
if (result == null) {
result = fibRec(index - 1).add(fibRec(index - 2));
fibIndex[index] = result; // you forgot this
}
return result;
}
编辑:之前我在这里做过一条记录,说明您不需要为仅调用一次的方法进行记忆,但是后来我记得该方法是递归的。因此,请忘记我之前在这里说过的内容,备忘录实际上可以大大加快该方法的速度。
答案 1 :(得分:3)
我注意到您实际上并没有在任何地方填写fibIndex
。基于此,您的if语句条件何时触发?
这使您对要解决的问题有感觉吗?