簡體   English   中英

Java堆棧溢出錯誤與遞歸

[英]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);

考慮到您對后綴遞增/遞減運算符的混淆使用,很難說出您的意思...

提示:為了避免將來發生此類錯誤,請將您的方法參數, rowcolumnfinal 您將無法在方法的主體中對其進行修改...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM