Sie sind auf Seite 1von 4

Estrutura de Dados Recursividade

"Para fazer um procedimento recursivo é preciso ter fé."


—prof. Siang Wun Song, USP.

"Ao tentar resolver o problema, encontrei obstáculos dentro de obstáculos.


Por isso, adotei uma solução recursiva."
—aluno S.Y., USP, 1998

"Para entender a recursão,


em primeiro lugar precisamos compreender a recursão."
—anônimo

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

UEG - Sistemas de Informação 06 de abril de 2009


Estrutura de Dados Recursividade
dada em termos "menores" que a definição original. É esse "menor" que faz com que em
algum momento, o ciclo se encerre e a definição esteja completa.

O que é um problema recursivo

Alguma coisa é recursiva quando é definida em termos dela própria.


Eis um exemplo da aritmética, bem simples, aquele que dá a definição dos números
naturais, em termos dos axiomas de Peano:

O primeiro natural é o zero.


O sucessor de um número natural é um número natural.

Um problema recursivo deve apresentar 3 características:


▫ Um processo que chame a si mesmo.
▫ A garantia de que a cada chamada, o universo de trabalho do processo será "menor".
▫ Uma condição, que obrigatoriamente ocorrerá, que indique o fim da recursão.

É 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.

Vantagens e desvantagens da recursão

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.

UEG - Sistemas de Informação 06 de abril de 2009


Estrutura de Dados Recursividade
Humor recursivo

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

A recursividade na programação de computadores envolve a definição de uma função que


pode invocar a si própria. Em geral, uma definição recursiva é definida por casos: um
número limitado de casos base e um caso recursivo. Os casos base são geralmente
situações triviais e não envolvem recursão.
Exemplos de problemas cujas soluções são inerentemente recursivas:
percurso de uma árvore;
busca de informações em estruturas hierárquicas;
algoritmos de divisão e conquista tais como o Quicksort e o Mergesort.

Um exemplo típico de problema recursivo é o cálculo do fatorial. Para calcular o fatorial


de 6, o computador tem de calcular primeiro o fatorial de 5 e só depois é que faz a
multiplicação de 6 pelo resultado (120). Por sua vez, para calcular o fatorial de 5, vai ter de
calcular o fatorial de 4. E por aí fora até esbarrar no caso base.

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

UEG - Sistemas de Informação 06 de abril de 2009


Estrutura de Dados Recursividade
Exercícios

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

Onde r é o resto da divisão de a por b.

3. Faça um programa para calcular os valores gerados pela Função de Ackermann,


conforme a definição abaixo:

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

7. Escreva uma função não recursiva para a seguinte função:


int f (int i)
{
if (i > 1) {
f = i + f(i-1);
} else {
f = 1;
}
}

UEG - Sistemas de Informação 06 de abril de 2009

Das könnte Ihnen auch gefallen