2016-01-13 110 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){/ *无限* /}。这并不是内存不足的原因是每个函数调用都被视为一组新的变量 - 这意味着每次递归都需要更多的内存(您需要了解函数调用堆栈的工作原理)。循环不一定需要每次更多的内存。 –