[英]Java stack overflow error with recursion
我有這段代碼一直在給我堆棧溢出錯誤,並且我不知道如何解決它(我是遞歸的新手)。 我的代碼有什么問題?
的
process(a, sum, row++, column);
由於使用了post -increment(使用@fge提示),無條件地調用具有完全相同參數的函數。 這立即導致無限遞歸。
解決此問題后,您將遇到另一個問題:您正在檢查該row
等於 a.length - 1
,並且您的代碼可以使其超過 a.length - 1
。
process(a, sum, row++, column); // increment #1
process(a, sum, row++, column--); // increment #2
這看起來是錯誤的:
process(a, sum, row++, column);
process(a, sum, row++, column--);
請注意,后遞增和后遞減運算符會遞增或遞減變量,然后返回該變量的舊值 。 因此,在這兩行的第一行中,您要使用與原始調用完全相同的值來調用方法process
。 然后,將使用相同的值等再次調用該方法,直到調用堆棧溢出為止。
此行process(a, sum, row++, column);
調用process(a, sum, row, column)
, then
遞增行!
具有相同參數的相同函數會被反復調用,因此會溢出堆棧。
這應該可以解決問題: process(a, sum, ++row, column);
它首先將其遞增,然后將其作為參數傳遞。 但隨后您的行將增加。 如果您不想這樣做,只需使用: process(a, sum, row + 1, column);
,它以遞增的行調用流程函數,同時不會在調用它的方法中更改您的行。
您致電:
process(a, sum, row++, column);
但是您使用postfix ++
運算符; 結果,如果row
不完全等於a.length - 1
則在調用 ->無限遞歸時,作為此函數的參數的row
值將不會更改 。
呼叫:
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);
考慮到您對后綴遞增/遞減運算符的混淆使用,很難說出您的意思...
提示:為了避免將來發生此類錯誤,請將您的方法參數, row
和column
, final
; 您將無法在方法的主體中對其進行修改...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.