Quais são as vantagens da recursão?
Algumas linguagens de programação podem otimizar a recursão da cauda, mas, ainda em termos gerais, a recursão consome mais recursos do que os loops regulares.
É possível ter uma versão iterativa de alguma função recursiva?
recursion
advantages
OscarRyz
fonte
fonte
Respostas:
Sim, você pode codificar funções recursivas como iterações. Basicamente, você precisa manter as informações manualmente, que de outra forma seriam tratadas pelo método que chama o código gerado pelo compilador.
Em outras palavras, você precisa de uma pilha em que cada entrada seja uma estrutura que contenha os parâmetros passados e todas as variáveis locais. Você sempre trabalha na entrada mais alta da pilha. Se precisar ligar para si mesmo, crie uma nova entrada e coloque em cima da pilha. Quando terminar, pegue a entrada mais alta da pilha, expondo a abaixo, e use a entrada mais alta anteriormente para extrair os valores de retorno e atualizar a nova entrada mais alta de acordo.
Sugiro que você estude um livro do compilador para ver como isso geralmente é implementado no código da máquina.
fonte
A recursão geralmente é uma maneira mais natural de ver as coisas do que a iteração. Por exemplo, considere a passagem inorder de uma árvore binária:
inorder(left); process(); inorder(right);
é muito mais simples do que manter explicitamente uma pilha.Enquanto você não for muito fundo (explodindo a pilha), a diferença no uso de recursos é geralmente trivial. Não se preocupe com isso em geral. O código simples é normalmente melhor que o código otimizado à mão, embora haja exceções. Certo é normalmente melhor que rápido.
Qualquer algoritmo recursivo pode ser expresso como um algoritmo iterativo, mas pode ser necessário manter uma pilha explícita (correspondente à pilha de chamadas manipulada implicitamente). Afinal, se você compilar uma função recursiva, obtém algo que depende da manipulação de uma pilha e do loop da função, e isso é iterativo.
Funções recursivas de cauda podem ser facilmente traduzidas em loops e não precisam de uma pilha, mas esse é um caso especial.
fonte
Tente resolver o problema das Torres de Hanói de forma iterativa. Depois de desistir, dê uma olhada na solução iterativa e compare com a solução recursiva. Qual é o mais simples?
Sim, em princípio. No entanto, para muitos problemas, incluindo tarefas muito comuns, como travessias de árvores, as soluções recursivas são muito mais simples e mais elegantes que as iterativas.
fonte
Simplicidade. Sem a otimização de chamada final, é claro que é preciso mais recursos (pilha), mas como você implementaria, digamos,
deltree
em Java sem recursão? O problema é quedelete()
só é possível excluir diretórios se estiverem vazios; aqui está com recursão:fonte
Acredito que a recursão é uma daquelas ferramentas que um programador deve ter para viver. Com a recursão, você pode "pensar" em seus algoritmos e resolvê-los da maneira que você pensou sobre isso. Mas, devo adverti-lo, todo mundo está falando sobre o quão bonita é a recursão e quanta simplicidade traz ao código, pois tenho algumas coisas a dizer:
Tendo essas coisas em mente, aprenda a recursão! é engraçado, complexo e esmagará seu cérebro !, mas você se sentirá adorando.
Boa sorte!
fonte