记忆斐波那契递归方法不是更快?

时间:2019-02-10 06:37:34

标签: java recursion fibonacci biginteger memoization

我尝试记忆一个递归的斐波那契方法,它返回正确的数字。但是,它似乎没有比以前更快。我以为这是因为我没有正确利用数组来跟踪,而我仍在进行冗余调用。您能告诉我要进行哪些更改,以便我可以正确使用它吗?

不确定是否重要,但是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;
}

2 个答案:

答案 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语句条件何时触发?

这使您对要解决的问题有感觉吗?