【发布时间】:2016-12-02 19:32:40
【问题描述】:
我一直在尝试制作一个斐波那契数返回器(给定输入 n 返回斐波那契序列中索引位置 n 处的元素)。我试图使它既递归又具有低空间复杂度(我不实例化任何新变量)。我使用 Integer 对象作为值,虽然我知道它们的值溢出(它们返回负值),但这实际上是故意的(出于教育目的)。该函数被称为 smartestFib,因为它的空间复杂度低于我的其他函数。
当我将 smartestFib(n) 调用为 130 或更高时,就会出现问题。对于 129 或更低,它工作得非常好(考虑到溢出),但它为 130 及以上提供了例外。主要问题是我无法找出异常实际上是什么:它显示了太多错误,以至于我看不到第一个错误,因此不知道确切的错误是什么。因为我不知道错误的类型,所以我无法捕捉到它。
我的代码是:
private static int smartestFib(Integer goalNum)
{
if (goalNum < 2)
return 1;
else
return smartestFib(goalNum-2, 0, 1,1);
}
private static int smartestFib(Integer goalNum, Integer currentNum, Integer lastValue, Integer beforeLastValue)
{
if (goalNum == currentNum)
return lastValue + beforeLastValue;
else
{
return smartestFib(goalNum, currentNum + 1, lastValue+beforeLastValue,lastValue);
}
}
对于这个问题,我非常感谢一些帮助,因为问题的任意性使我相信这是我不知道的一些技术问题,我不知道去哪里找。非常感谢。
编辑:显然它可能是 StackOverflowError,非常感谢!但现在我想知道, 我还有其他功能,空间复杂度更高,他们没有这个问题。如何?
private static int smarterFib(int goalNum)
{
assert (goalNum >= 0): "The variable goalNum may not negative.";
if (goalNum < 2)
return 1;
else
{
ArrayList<Integer> sequenceList = new ArrayList<Integer>(Arrays.asList(new Integer[] {1,1}));
return smarterFib(goalNum-2, sequenceList);
}
}
private static int smarterFib(int goalNum, ArrayList<Integer> priorValues)
{
assert (goalNum >= 0): "The variable goalNum may not negative.";
assert (priorValues != null): "The array priorValues has not been initialized.";
if (goalNum <= priorValues.size()-2)
return (priorValues.get(priorValues.size()-1) + priorValues.get(priorValues.size()-2));
else
{
priorValues.add(priorValues.get(priorValues.size()-1) + priorValues.get(priorValues.size()-2));
return smarterFib(goalNum, priorValues);
}
}
我不明白为什么这个不会引起问题,而我的新问题会..
【问题讨论】:
标签: java recursion runtime-error fibonacci