我一直試圖讓一個斐波那契數字返回者(給定一個輸入n返回索引位置n在斐波那契序列中的元素)。我試圖使它既是遞歸的,又具有低空間複雜性(我沒有實例化任何新的變量)。我使用Integer對象作爲值,儘管我知道它們的值溢出(它們返回負值),但這實際上是有意的(用於教育目的)。該函數稱爲smartestFib,因爲它比我的其他函數具有更低的空間複雜度。Java遞歸方法StackOverflowError與整數對象
當我調用130或更高版本的smartestFib(n)時出現問題。它工作得很好(考慮到溢出問題)爲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);
}
}
我不明白爲什麼這樣一個不會導致一個問題,我的新的做..
這是一個[StackOverflowError](http://stackoverflow.com/questions/214741/what-is-a-stackoverflowerror) – resueman