2016-04-24 2 views
0

Допустим, у вас есть метод:Как обрабатывать действие закрытия рекурсии в Java?

Object recursiveMethod() { 
    // do some things to an object. 
    Object obj = new Object(); 

    if (test fails) { 
     recursiveMethod(); // do the function again until it fails. 
    } 

    System.out.println("Returning object"); 
    return obj; 
} 

То, что я заметил, что функция ставится в очередь, если это не удается, а затем извлекается из стека после. Так что, если он не в 5 раз он будет печатать:

Returning object //success 
Returning object //failure 
Returning object //failure 
Returning object //failure 
Returning object //failure 
Returning object //failure 

Что это лучший способ иметь Returning object заявление печать только один раз?

Вот некоторые исследования, которые я сделал на рекурсии: http://www.toves.org/books/java/ch17-recur/

+0

Используйте метод _wrapping_, который вызывает рекурсивный метод. Затем поместите вывод консоли в метод упаковки и удалите его из рекурсивного. – Seelenvirtuose

+0

Это сработает, но я думаю, что объяснение Джона Кугельмана более изящно. – and0rsk

+0

Поместите 'else' перед строкой, которая его распечатает. – EJP

ответ

2

Вы должны вернуть результат рекурсивного вызова. В противном случае вы вызываете его, но выбрасываете его возвращаемое значение и вместо этого возвращаете объект, который не прошел тест.

if (test fails) { 
    return recursiveMethod(); 
} 

Помните, что, хотя это может быть хорошее упражнение, это не очень хорошая идея. Рекурсия - это плохой способ реализовать повторную попытку, потому что каждый раз, когда вы повторяете, стек увеличивается дольше. В конце концов, он будет переполняться, если вы повторите попытку слишком много раз. Гораздо лучше использовать цикл.

while (true) { 
    //do some things to an object. 
    Object obj = new Object(); 

    if (test succeeds) { 
     System.out.println("Returning object"); 
     return obj; 
    } 
} 
Смежные вопросы