Recusion - это инструмент выбора, когда вам нужно написать алгоритмы. Это также намного проще, чем итерация, когда вам приходится иметь дело с рекурсивными структурами данных, такими как деревья или граф. Как правило, безвредно, если (как правило) вы можете оценить оценку глубины отторжения до чего-то не слишком большого, при условии, что вы не забудете конечное условие ...
Большинство современных компиляторов способны оптимизировать некоторые виды рекурсивных вызовов (заменить их внутренне нерекурсивными эквивалентами). Это особенно легко с tail рекурсией, то есть когда рекурсивный вызов является последней инструкцией перед возвратом результата.
Однако есть некоторые проблемы, специфичные для Java. Базовая JVM не предоставляет никаких инструкций goto. Это устанавливает пределы того, что может делать компилятор. Если это хвостовая рекурсия, внутренняя для одной функции, ее можно заменить простым циклом, внутренним для функции, но если вызов терминала выполняется через другую функцию, или если несколько функций вызывают друг друга рекурсивно, это становится довольно трудно сделать, когда нацеливание на байт-код JVM. SUN JVM не поддерживает оптимизацию хвостового вызова, но есть планы изменить это, IBM JVM поддерживает оптимизацию хвостового вызова.
В некоторых языках (функциональных языках, таких как LISP или Haskell) рекурсия также является единственным (или более естественным) способом написания программ. На функциональных языках на основе JVM, таких как Clojure или Scala, отсутствие оптимизации хвостового вызова является проблемой, которая приводит к обходным путям, таким как trampolines в Scala.