遞歸vs循環?
回答
實施例1是一個永遠不會停止調用本身的方法。每次調用該方法時,都會向調用堆中添加一個新框架,直到出現StackOverflowError爲止。
示例2是一個無限循環。該方法只添加到callstack一次。
在第一個方法StackOverflowError將發生 – mahesh
你能解釋異常和錯誤之間的區別嗎? –
在Java中,異常是應用程序可能從中恢復的。開發者應該抓住例外。錯誤是無法恢復的情況,不應該被捕獲。 http://docs.oracle.com/javase/7/docs/api/java/lang/Error.html –
那麼,遞歸最終會崩潰。使用遞歸時,只能在程序執行完大小之前進入一定的級別來調整方法。
使用while循環沒有任何其他代碼應該永遠運行,因爲沒有更多的調用另一個方法,你不再對堆棧做任何事情。
遞歸調用一遍又一遍的相同方法,這需要「空間」放置方法(如一堆方法),一旦堆太大,程序就會退出。使用遞歸有一些優點,但更多的情況是循環更適合。
(甚至當真正的循環中,您可以用「破」終止)
一般在Java中每個線程有一些所謂的調用堆棧。每個方法執行進入堆棧,如果一個方法執行另一個方法,然後另一個方法在調用堆棧上結束幾個方法。
RandomObject.method1()方法2()方法3()
會給你疊的:。
方法3()
方法2()
method1()
問題是堆棧空間有限,遞歸會很快填滿它,給你討厭的StackOverFlow異常。
在你的情況下,它看起來像
的run()run()中的run()(..)
那麼棧看上去可能會:。
( ...)
RUN()
RUN()
RUN()
第二種選擇是隻有一個上調用棧的方法和它會循環infinitly沒有崩潰..
第一種方法將被稱爲遞歸式
第二種方法將被稱爲一種類型,但它會是s在無限次內循環播放,不會從循環播放。
- 1. 遞歸vs循環
- 2. 瞭解遞歸vs循環ruby
- 3. Jinja2的遞歸循環VS字典
- 4. 遞歸循環
- 5. 循環遞歸
- 6. C#遞歸循環
- 7. Foreach循環+遞歸
- 8. Matlab遞歸循環
- 9. 類遞歸循環
- 10. 遞歸循環XSLT
- 11. 遞歸循環R
- 12. 遞歸代碼非循環遞歸
- 13. 轉換爲循環...遞歸遞歸
- 14. for循環遞歸函數
- 15. for循環遞歸迭代
- 16. 遞歸循環文本
- 17. 如何遞歸循環呢?
- 18. 用遞歸替換循環
- 19. Javascript:用for循環遞歸
- 20. 遞歸和while循環
- 21. 遞歸循環跟蹤
- 22. Stackless Python - 遞歸for循環?
- 23. 遞歸嵌套循環
- 24. Swift:GeoCoding遞歸異步循環
- 25. 用foreach循環遞歸
- 26. For循環執行遞歸
- 27. Node.js遞歸循環失敗
- 28. 循環和遞歸展開
- 29. 用循環替換遞歸
- 30. 遞歸循環Selenium Webdriver
可能的重複http://stackoverflow.com/questions/660337/recursion-vs-loops –
一個是無限遞歸,另一個是無限循環? –
看到此[線程](http://stackoverflow.com/a/660350/945317) – Younes