TL; DR: функциональные языки обрабатывают рекурсию лучше, чем нефункциональные?
В настоящее время я читаю Code Complete 2. В какой-то момент в книге автор предупреждает нас о рекурсии. Он говорит, что этого следует избегать, когда это возможно, и что функции, использующие рекурсию, обычно менее эффективны, чем решения, использующие циклы. В качестве примера автор написал функцию Java, использующую рекурсию для вычисления факториала числа, например, (например, это может быть не совсем так, поскольку у меня сейчас нет книги):
public int factorial(int x) {
if (x <= 0)
return 1;
else
return x * factorial(x - 1);
}
Это представляется как плохое решение. Однако в функциональных языках использование рекурсии часто является предпочтительным способом работы. Например, вот такая функция в Haskell с использованием рекурсии:
factorial :: Integer -> Integer
factorial 0 = 1
factorial n = n * factorial (n - 1)
И широко принимается как хорошее решение. Как я видел, Хаскелл очень часто использует рекурсию, и я нигде не видел, чтобы ее осуждали.
Так что мой вопрос в основном таков:
- Функциональные языки обрабатывают рекурсию лучше, чем нефункциональные?
РЕДАКТИРОВАТЬ: я знаю, что примеры, которые я использовал, не являются лучшими, чтобы проиллюстрировать мой вопрос. Я просто хотел отметить, что Haskell (и функциональные языки в целом) использует рекурсию гораздо чаще, чем нефункциональные языки.
factorial n = product [1..n]
более краткий, более эффективный и не переполняющий стек в целом n
(и, если вам требуется запоминание, требуются совершенно другие параметры). product
определяется в терминах некоторых fold
, который будет определен рекурсивно, но с крайней осторожностью. Рекурсия является приемлемым решением в большинстве случаев, но все равно легко сделать это неправильно / неоптимально.