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)
І широко сприймається як хороше рішення. Як я бачив, Хаскелл дуже часто використовує рекурсію, і я ніде не бачив, щоб вона нахмурилася.
Тому в основному моє питання:
- Чи функціональні мови справляються з рекурсією краще, ніж нефункціональні?
EDIT: Я знаю, що приклади, які я використав, не найкращі для ілюстрації мого питання. Я просто хотів зазначити, що Haskell (і функціональні мови взагалі) використовують рекурсію набагато частіше, ніж нефункціональні мови.
factorial n = product [1..n]
є більш лаконічним, ефективнішим і не переповнює стек для великих n
(і якщо вам потрібна пам'ятка, потрібні зовсім інші варіанти). product
визначається в термінах деяких fold
, який буде визначений рекурсивно, але з крайньою обережністю. Рекурсія є прийнятним рішенням більшу частину часу, але все одно просто зробити це неправильно / субоптимально.