2016-01-13 2 views
-1

В рекурсии, если у меня есть в следующем примере кодарекурсии и во время цикла

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) {/ * делать бесконечно * /}. Причина, по которой это не заканчивается, состоит в том, что каждый вызов функции обрабатывается как новый набор переменных - это означает, что в каждой рекурсии требуется больше памяти (вам нужно прочитать, как работает стек вызовов функций). Цикл не обязательно требует больше памяти каждый раз. –

Смежные вопросы