Beruflich Dokumente
Kultur Dokumente
Recursividade
Tem coisas que a gente precisa repetir para aprender. As crianças, por exemplo, repetem
um mesmo gesto inúmeras vezes. Mas, para o sistema neural e para o cérebro, aquilo não é
uma simples repetição, mas uma recursão. Cada vez que estamos aprendendo algo e
repetimos um mesmo gesto várias vezes, o cérebro refaz seus processos acrescentando algo
novo e não apenas repete o mesmo caminho. Ele realiza iterações, isto é, parte de algo que
já foi feito e acrescenta algo novo. Ao repetirmos algo, ele refaz o caminho, mas retorna
enriquecido. É isso que nos dá a sensação de ter aprendido algo depois de repetir um
mesmo gesto várias vezes.
A recursividade é uma daquelas idéias em informática (como algumas da vida comum) que
em geral dividem a população em dois grupos antagônicos: os que são francamente
favoráveis, em geral impressionados com a elegância e simplicidade dos algoritmos
recursivos, e os que a consideram uma frivolidade a ser evitada a todo custo. No caso da
recursividade, talvez haja que se acrescentar um terceiro grupo: o daqueles que não a
conhecem, ou nunca chegaram a entendê-la, e que, talvez por isso, com maior facilidade se
alinhem no segundo grupo. Uma possível explicação para esse desconforto vem da
sensação de que a recursividade leva o procedimento ao infinito e este conceito tem
assustado o homem desde a Antigüidade.
Um programador digno do nome terá que conhecê-la, entendê-la e estar pronto a usá-la
quando for a melhor (ou as vezes única) alternativa. Em geral, uma solução recursiva
admite um algoritmo equivalente não recursivo. E também em geral, tal solução não
recursiva exige maior código, embora este seja mais facilmente entendível, com exceção
daquelas (poucas) pessoas que conseguem ver a recursividade como algo claro e límpido.
Mas, afinal, o que é a recursividade ? É a descrição de algo em termos dele mesmo. Só que
para que a definição não seja circular (e portanto infinita), a descrição recursiva deve ser
É importante que um programa recursivo deve ter obrigatoriamente uma condição que
controla sua execução ou término, sob pena de produzir uma computação interminável.
Um programa recursivo é mais elegante e menor que a sua versão iterativa, além de exibir
com maior clareza o processo utilizado, desde que o problema ou dados sejam
naturalmente definidos através da recorrência.
Por outro lado, um programa recursivo exige mais espaço de memória e é mais lento do
que a versão iterativa.
Recursão indireta
Funções podem ser recursivas (invocar a si próprias) indiretamente, fazendo isto através de
outras funções: assim, "P" pode chamar "Q" que chama "R" e assim por diante, até que "P"
seja novamente invocada.
Uma piada comum de nerd (Do dicionário Hacker) é a seguinte “definição” de recursão.
Recursão
Ver "Recursividade".
Isso é uma paródia às referências encontradas em dicionários, que em alguns casos podem
levar a definições circulares.
Outros exemplos são os acrônimos recursivos, tais como:
GNU - GNU is Not Unix;
PHP - PHP: Hypertext Preprocessor.
Recursividade na computação
Resumindo, aquilo que acontece internamente é uma expansão seguida de uma contração:
fatorial (6)
6 * fatorial (5)
6 * 5 * fatorial (4)
6 * 5 * 4 * fatorial (3)
6 * 5 * 4 * 3 * fatorial (2)
6 * 5 * 4 * 3 * 2 * fatorial (1)
6 * 5 * 4 * 3 * 2 * 1 * fatorial (0)
6 * 5 * 4 * 3 * 2 * 1 * 1
6 * 5 * 4 * 3 * 2 * 1
6 * 5 * 4 * 3 * 2
6 * 5 * 4 * 6
6 * 5 * 24
6 * 120
720
1. Escreva uma função recursiva que receba um inteiro n, e retorne o valor inteiro do
n-ésimo termo da sequência de Fibonacci, definida pela fórmula abaixo:
2. Faça uma função recursiva que calcule e retorne o máximo divisor comum de 2
números, a e b, utilizando o algoritmo de Euclides.
mdc(a, b) = mdc(b, r)
mdc(c, 0) = c
4. Crie uma função recursiva que receba dois valores inteiros b e p, e retorne o valor da
p
potência b .
5. Faça uma função recursiva que receba um inteiro n, e retorne o valor do somatório:
∑ = n + (n-1) + (n-2) + . . . + 2 + 1
6. Faça uma função recursiva que receba um inteiro n, e retorne o valor do produtório:
∏ = n * (n-1) * (n-2) * . . . * 2 * 1