TL; DR: As linguagens funcionais lidam melhor com a recursão do que as não-funcionais?
Atualmente, estou lendo o Código Completo 2. Em algum momento do livro, o autor nos adverte sobre recursão. Ele diz que deve ser evitado quando possível e que funções usando recursão são geralmente menos eficazes do que uma solução usando loops. Como exemplo, o autor escreveu uma função Java usando a recursão para calcular o fatorial de um número como esse (pode não ser exatamente o mesmo, pois não tenho o livro comigo no momento):
public int factorial(int x) {
if (x <= 0)
return 1;
else
return x * factorial(x - 1);
}
Isso é apresentado como uma solução ruim. No entanto, em linguagens funcionais, o uso da recursão costuma ser a maneira preferida de fazer as coisas. Por exemplo, aqui está a função fatorial em Haskell usando recursão:
factorial :: Integer -> Integer
factorial 0 = 1
factorial n = n * factorial (n - 1)
E é amplamente aceito como uma boa solução. Como já vi, Haskell usa a recursão com muita frequência, e não vi em nenhum lugar que ela seja desaprovada.
Então, minha pergunta é basicamente:
- As linguagens funcionais lidam melhor com a recursão do que as não funcionais?
EDIT: Estou ciente de que os exemplos que usei não são os melhores para ilustrar minha pergunta. Eu só queria salientar que Haskell (e linguagens funcionais em geral) usa recursão com muito mais frequência do que linguagens não funcionais.
factorial n = product [1..n]
é mais sucinto, mais eficiente e não sobrecarrega a pilha por muito tempo n
(e se você precisar de memorização, são necessárias opções totalmente diferentes). product
é definido em termos de alguns fold
, que é definido recursivamente, mas com extremo cuidado. A recursão é uma solução aceitável na maioria das vezes, mas ainda é fácil fazer errado / abaixo do ideal.