2016-01-13 126 views
-1

在遞歸,如果我有以下示例代碼遞歸和while循環

public class StringPractice { 
    public static void main(String[] args){  
     hello(); 
    } 
    public static void hello(){ 

     System.out.println("heloo world!"); 
     hello(); 
    } 
} 

它將導致的StackOverflowError。但是,如果我使用while循環,例如while(true)和打印輸出函數hello,它將保持循環與輸出,但不會給我們StackOverFlowError。有人可以解釋爲什麼嗎?有什麼不同?

回答

0

您沒有邏輯測試是否要停止遞歸,因此函數被一次又一次地調用,將其添加到調用堆棧中,直到內存不足。

public class StringPractice { 
    public static void main(String[] args){  
     hello(10); 
    } 
    public static void hello(int n){ 

     System.out.println("hello world! " + n); 
     hello(n - 1); // TODO do a test before calling this function again. 
    } 
} 
+0

爲什麼如果我使用while循環沒有邏輯測試它不會導致stackoverflow?循環只是保持循環。 –

+0

哦謝謝,我想我現在就明白了! –

+0

除非您提供一個可以終止它的條件,否則您可以永久地讓循環繼續。 'while(true){/ *無限* /}。這並不是內存不足的原因是每個函數調用都被視爲一組新的變量 - 這意味着每次遞歸都需要更多的內存(您需要了解函數調用堆棧的工作原理)。循環不一定需要每次更多的內存。 –