При программировании на Java (или на любом другом языке процедур, если на то пошло), я часто выбираю решая что-то рекурсивно vs итеративно. Рекурсивный вариант часто более элегантный, чем итеративное решение, поэтому я обычно использую рекурсивное решение. За одним исключением:
Беспокойство о переполнении стека. Я стараюсь избегать рекурсивных решений, если максимальная глубина стека линейно пропорциональна размеру ввода (или хуже). Однако я понимаю, что во многих других языках (даже для таргетинга на JVM, таких как Scala и Clojure) многие алгоритмы, такие как, например, алгоритмы базового списка, часто выражаются рекурсивно, где максимальная глубина стека пропорциональна длине список. (1) Итак, мои заботы о переполнении стека в алгоритмах с линейной стекой-глубиной оправданы?
TL; DR: Какая "сложность глубины стека" считается разумной? Логарифмическая сложность, рекурсивный двоичный поиск, например, O (log N), конечно, хорошо, но как насчет O (N), O (N log N), O (N 2)? Где вы обычно рисуете линию? (2)
(1) Я понимаю, что такие языки иногда поддерживают такие вещи, как @tailrec, но этот вопрос касается Java, С# и т.д.
(2) Обратите внимание, что я не обеспокоен загрузкой процессора и т.д. Просто глубина стека.