2014-03-02 185 views
0

我有這個代碼,一直給我堆棧溢出錯誤,我不知道如何解決它(我是新遞歸)。我的代碼有什麼問題?Java堆棧溢出錯誤與遞歸

+2

極好的時間來學習如何調試。 –

+0

這是什麼'alist'? – fge

+0

你爲什麼叫過程兩次? –

回答

6

 process(a, sum, row++, column); 

無條件調用具有完全相同的參數功能由於使用 -Increment(帽尖到@fge爲察覺這一點)的。這立即導致無限遞歸。

一旦你解決這個問題,你會碰到一個問題:你是檢查row等於a.length - 1,和你的代碼可以使它超過a.length - 1

 process(a, sum, row++, column); // increment #1 
     process(a, sum, row++, column--); // increment #2 
+0

@fge:Well spotted,謝謝!我已經更新了包含這個的答案。 – NPE

+0

它使用相同的參數調用,會導致堆棧溢出。如果問題是雙重增量,那麼將會有一個數組索引異常。 –

+0

@TedHopp:這仍然是一個錯誤,並且會在其他bug被修復時顯示出來。 – NPE

0

這看起來錯:

process(a, sum, row++, column); 
process(a, sum, row++, column--); 

注意,增量後和遞減運算符遞增或遞減一個變量,然後返回變量的舊值。因此,在這兩行的第一行中,您將調用方法process,其中的值與原始調用完全相同。然後,它會再次調用具有相同值的方法等,直到調用堆棧溢出。

0

該行process(a, sum, row++, column);調用process(a, sum, row, column)then它增加行!

具有相同參數的相同函數被再次調用,因此它會溢出堆棧。

這應該是訣竅:process(a, sum, ++row, column);它首先增加它,然後將它作爲參數傳遞。但是你的行會增加。如果你不想這樣做,只需使用:process(a, sum, row + 1, column);,它會調用具有遞增行的處理函數,同時不會更改從其調用的方法中的行。

+1

或者,也許更好,只需使用'row + 1'作爲參數。 –

+0

@TedHopp - 好點:) – libik

0

您致電:

process(a, sum, row++, column); 

但你使用後綴++操作;因此,作爲該函數的參數的row值在調用→無限遞歸時不會改變,如果row不完全等於a.length - 1

電話:

process(a, sum, row + 1, column); 

此外,檢查以下行你實際上意味着要呼籲:

process(a, sum, row + 2, column); 

,而不是:

process(a, sum, row + 2, column - 1); 

甚至:

process(a, sum, row + 1, column - 1); 

鑑於你的困惑使用後綴遞增/遞減運算符,它是很難告訴你的意思是做什麼...

提示:爲了避免那種錯誤的未來,讓你的方法參數, rowcolumnfinal;你將無法修改它們在方法的身體...