algoritmo: do Lat. algorithmos < Ár. alkharizmi: [Inform.] conjunto de etapas bem definidas necessárias para chegar à resolução de um problema.
January 8, 2006
A recursão é uma das técnicas mais simples e úteis que existem para usarmos em nossos algoritmos. Consiste em uma função (denominada recursiva) chamar a si mesmo, até que o retorno seja trivial. Resolvi abordá-la aqui porque alguns algoritmos que estudaremos mais para frente usam funções recursivas.
Em matemática, o número fatorial de
é igual a:
.
Logo, por exemplo,
(cinco fatorial) seria igual a:
.
Um exemplo bom e simples de recursão é um algoritmo para determinar números fatoriais:
1. função fatorial (n) 2. se, então 3. retorna
4. senão 5. retorna
6. fim-se 7. fim-função
Domínio de nossa função:
.
Vamos abrir um grande parênteses aqui até a próxima linha horizontal para descobrir qual o custo do nosso algoritmo antes de continuar com a conversa sobre recursão e relembrar/reforçar o post sobre Análise de Algoritmos. Vou colocar o número de vezes que cada instrução é executada, usando o esquema que será o padrão para as próximas vezes que veremos custos:
Número da linha: Número de vezes que é executada..






Uma função linear, o tipo de algoritmo mais simples que podemos encontrar, com excessão dos que são uma função constante. Mas o parênteses na verdade não serviu só pra isso. Eu queria aproveitar pra escovar uns bits de nosso código. Você percebeu que o primeiro condicional é executado
vezes, mas só entramos nele uma vez? Então vamos inverter nosso condicional.
1. função fatorial (n) 2. se, então 3. retorna
4. senão 5. retorna
6. fim-se 7. fim-função






Claro que continua uma função linear, não houve nenhuma grande mudança. Os dois continuam com a mesma ordem de crescimento e tal...
comparado com
é uma diferença pequena, mas essa solução ficou bem mais elegante.
Poxa, diminuímos o custo do algoritmo em
! Hehehe...
Agora, antes de continuar, só vamos definir a notação assintótica desse nosso novo custo!
A fórmula do
é: 
Substituindo pela nossa função, temos:
. É trivial, que podemos escolher para as duas constantes
e para
. Com isso pretendi mostrar-lhes uma conclusão óbvia que no outro artigo não tinha mostrado para não complicar muito: uma função reta (linear) pertence sempre a notação
e uma função quadrática pertence sempre a notação
(ora, façam um gráfico das funções e vejam se isso não é óbvio!). Mas vamos aprendendo mais sobre análise de algoritmos com o tempo...
Bom... Continuando com a recursão... Nossa função cria um loop consigo mesma, ao invés de usar um para (for) ou enquanto (while). Ela se repete diminuindo um de
a cada iteração, até que chegue ao valor mínimo
aonde a resposta é trivial:
.
O que é necessário para criarmos uma recursão? Apenas um ponto de parada! Temos que tomar cuidado para não criarmos loops infinitos cuidando sempre com cada entrada que o usuário pode colocar. Nesse caso, eu determinei que o domínio da função é
. Se o cara colocasse
, minha função iria diminuindo infinitamente... e nunca iria retornar nada!
Para fazer a recursão portanto, precisamos analisar o domínio de nossa função e mais: precisamos conhecer um valor (que vai ser o limite; no caso do fatorial, o valor que sabíamos é que
).
Acredito que vocês tenham achado tudo simples e que não tenham problema com isso. Funções recursivas vão ser extremamente úteis para nós nos próximos artigos. Vou finalizar mostrando-lhes alguns casos básicos de algoritmos em que podemos usar a recursão:
1. função fibonacci (n) 2. se, então 3. retorna
4. senão 5. retorna
6. fim-se 7. fim-função
Domínio de fibonacci(n): 
Depois descobriremos como calcular os números de Fibonacci mais rápido, mas por enquanto nosso objetivo é a recursão!
Vamos supor que você quer imprimir os números de n a 1 e esqueceu a sintaxe do para...
1. função imprime_ate (n) 2. imprima3. se
, então 4. imprime_ate(n-1) 5. fim-se 6. fim-função
Domínio de imprime_ate(n): 
Todo loop pode ser uma recursão e tem alguns que ficam bem mais fáceis se forem! Nesse caso, é claro que seria mais simples usarmos um para!
Vamos trabalhando com eles com o tempo...
Espero que tenham gostado do artigo (pelo menos, tenho certeza que vocês vão achar mais simples que o último!). Qualquer dúvida, sugestão ou notificação de erro; poste um comentário ou me envie um e-mail.
Compare Preços de: notebooks, acer aspire, hp pavilion, computadores, pentium 4, nintendo wii, ps3, celulares, câmeras digitais
Mto boa explicação ! Estava procurando material sobre recursão e este é bem explicativo.
[…] O artigo está em outro local agora: Recursão […]
Gostei d ter gasto alguma da minha atencao neste artigo
saio do artigo satisfeito
gostei imenso dos exemplos
bem gostei
Este design foi copiado do CSS Zen Garden e modificado com autorização de seu autor, Gunta Klavina.
Todo o conteúdo deste site (incluindo textos, imagens, arquivos de áudio e quaisquer outros trabalhos), exceto quando especificado o contrário, está licenciado por Tiago Madeira sob uma Licença Creative Commons.