我有這個代碼,一直給我堆棧溢出錯誤,我不知道如何解決它(我是新遞歸)。我的代碼有什麼問題?Java堆棧溢出錯誤與遞歸
回答
的
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
這看起來錯:
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);
,它會調用具有遞增行的處理函數,同時不會更改從其調用的方法中的行。
或者,也許更好,只需使用'row + 1'作爲參數。 –
@TedHopp - 好點:) – libik
您致電:
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);
鑑於你的困惑使用後綴遞增/遞減運算符,它是很難告訴你的意思是做什麼...
提示:爲了避免那種錯誤的未來,讓你的方法參數, row
和column
,final
;你將無法修改它們在方法的身體...
- 1. 遞歸java堆棧溢出錯誤
- 2. Java堆棧與遞歸溢出
- 3. 遞歸方法堆棧溢出錯誤
- 4. 堆棧溢出錯誤,無遞歸
- 5. 遞歸 - 堆棧溢出錯誤
- 6. 遞歸Java方法給出堆棧溢出錯誤
- 7. 尾遞歸:堆棧溢出
- 8. 尾遞歸堆棧溢出
- 9. Haskell遞歸堆棧溢出
- 10. java堆棧溢出錯誤?
- 11. 堆棧溢出錯誤(Java)
- 12. 堆棧溢出與尾遞歸
- 13. Java遞歸數獨求解器中的堆棧溢出錯誤
- 14. Lisp堆棧溢出遞歸函數
- 15. 通過遞歸導致堆棧溢出
- 16. 遞歸函數中的堆棧溢出
- 17. 遞歸函數堆棧溢出
- 18. 遞歸方法中的堆棧溢出
- 19. 遞歸函數堆棧溢出
- 20. 使用遞歸溢出堆棧
- 21. ColdFusion:遞歸太深;堆棧溢出
- 22. 遞歸求和堆棧溢出
- 23. C#填充TreeView遞歸堆棧溢出
- 24. 堆棧溢出和遞歸方法
- 25. 如何避免遞歸堆棧溢出?
- 26. 遞歸函數haskell堆棧溢出
- 27. 來自遞歸目錄遍歷的堆棧溢出錯誤
- 28. 遞歸字符串操作期間堆棧溢出錯誤
- 29. Android:堆棧溢出錯誤 - 遞歸太深
- 30. 無限遞歸函數 - >堆棧溢出錯誤
極好的時間來學習如何調試。 –
這是什麼'alist'? – fge
你爲什麼叫過程兩次? –