2014-04-02 211 views
-1

任何人都可以解釋兩種方法之間的區別嗎?遞歸vs循環?

方法1

public void run(){ 
    run(); 
} 

方法2

public void run(){ 
    while(true){ 

    }  
} 
+1

可能的重複http://stackoverflow.com/questions/660337/recursion-vs-loops –

+2

一個是無限遞歸,另一個是無限循環? –

+0

看到此[線程](http://stackoverflow.com/a/660350/945317) – Younes

回答

6

實施例1是一個永遠不會停止調用本身的方法。每次調用該方法時,都會向調用堆中添加一個新框架,直到出現StackOverflowError爲止。

示例2是一個無限循環。該方法只添加到callstack一次。

+1

在第一個方法StackOverflowError將發生 – mahesh

+0

你能解釋異常和錯誤之間的區別嗎? –

+0

在Java中,異常是應用程序可能從中恢復的。開發者應該抓住例外。錯誤是無法恢復的情況,不應該被捕獲。 http://docs.oracle.com/javase/7/docs/api/java/lang/Error.html –

0

那麼,遞歸最終會崩潰。使用遞歸時,只能在程序執行完大小之前進入一定的級別來調整方法。

使用while循環沒有任何其他代碼應該永遠運行,因爲沒有更多的調用另一個方法,你不再對堆棧做任何事情。

遞歸調用一遍又一遍的相同方法,這需要「空間」放置方法(如一堆方法),一旦堆太大,程序就會退出。使用遞歸有一些優點,但更多的情況是循環更適合。

(甚至當真正的循環中,您可以用「破」終止)

0

一般在Java中每個線程有一些所謂的調用堆棧。每個方法執行進入堆棧,如果一個方法執行另一個方法,然後另一個方法在調用堆棧上結束幾個方法。

RandomObject.method1()方法2()方法3()

會給你疊的:。

方法3()

方法2()

method1()

問題是堆棧空間有限,遞歸會很快填滿它,給你討厭的StackOverFlow異常。

在你的情況下,它看起來像

的run()run()中的run()(..)

那麼棧看上去可能會:。

( ...)

RUN()

RUN()

RUN()

第二種選擇是隻有一個上調用棧的方法和它會循環infinitly沒有崩潰..

0

第一種方法將被稱爲遞歸式

第二種方法將被稱爲一種類型,但它會是s在無限次內循環播放,不會從循環播放。