You are on page 1of 6

FACULDADE ANHANGUERA DE CAMPINAS UNIDADE 2

CINCIA DA COMPUTAO / SISTEMAS DE INFORMAO


ESTRUTURAS DE DADOS

AULA 5 e 6
RECURSIVIDADE
1. CONCEITO
So procedimentos que chamam a si prprios para executar determinada tarefa.
A recursividade, apesar de ser uma soluo mais elegante e inteligente, menos
eficiente que a iterao porque instancia mais variveis e consequentemente usa mais
memria.
As funes podem ser chamadas recursivamente, ou seja, dentro do corpo de uma
funo pode-se chamar novamente a mesma funo. Se a funo a() chama a prpria
funo a(), ocorre uma recurso direta; mas se a funo a() chama a funo b() que,
por sua vez, chama a funo a(), ocorre uma recurso indireta.
Todo algoritmo deve terminar a sua execuo aps ter realizado uma quantidade
finita de repeties ou passos. Portanto deve-se tomar muito cuidado ao se definir uma
condio de parada da recurso para evitar um loop infinito.
2. ALGORITMOS RECURSIVOS
2.1. Fatorial
int fatorial(int n)
{
if(n==0)
return 1;
else
return (n*fatorial(n-1));
}
2.2. Srie de Fibonacci (ensimo termo)
int fib(int n)
{
if(n<=1)
return n;
else
return (fib(n-1)+fib(n-2));
}
Pgina 1

2.3. Mximo Divisor Comum (MDC)


int mdc(int n1, n2)
{
if (n2==0)
return(n1);
else
return(mdc(n2, n1%n2));
}
3. RECURSO DEGENERADA
Casos em que o custo de usar recurso no compensa a vantagem da simplicidade
da lgica, ou seja, a execuo recursiva passa a ser mais custosa do que uma simples
iterao.
3.1. Recurso de cauda
caracterizada pelo uso de vrias chamadas recursivas, onde o resultado da ltima
chamada serve como parmetro de retorno de todas as chamadas anteriores, encerrando
a recurso.
Exemplo: clculo do MDC
int mdc(int n1, n2)
{
if (n2==0)
return(n1);
else
return(mdc(n2, n1%n2));
}

Verso iterativa
int mdc(int n1, int n2)
{
int aux;
while (n2>0){
aux=n1;
n1=n2;
n2=aux%n2;
}
return(n1);
}

Pgina 2

3.2. Recurso redundante


caracterizada quando as chamadas recursivas geram vrias subchamadas iguais.
Exemplo: Ensimo termo da srie de Fibonacci.
int fib(int n)
{
if(n<=1)
return n;
else
return (fib(n-1)+fib(n-2));
}

Verso iterativa
int fib(int n)
{
int i=0, a=1, b=0, c=0;
for(i=0; i<n; i++){
c=a+b;
a=b;
b=c;
}
return(c);
}
4. TORRES DE HANI (caso clssico de recurso)
H muito tempo, no alto das montanhas de Hani, havia um mosteiro onde habitavam
sacerdotes brmanes. Entre eles era praticado um ritual de predizer o fim do mundo. Conta a lenda
que no mosteiro havia trs torres, sendo que na primeira delas estavam empilhados 64 discos de ouro
em tamanhos decrescentes. Os sacerdotes acreditavam que quando eles terminasses de transferir
todos os discos da primeira torre para a terceira usando a segunda como apoio , sem nunca
colocar um disco maior sobre outro menor, ento, nesse dia, o mundo acabaria!
Para simplificar, ser apresentado um exemplo com apenas trs discos, conforme a
figura que se segue.

Pgina 3

O objetivo transferir os trs discos da torre 1 para a torre 3, usando a torre 2 como
apoio. Somente o primeiro disco de uma torre pode ser transferido para outra e um disco
nunca pode ser colocado sobre outro menor. Veja uma soluo desse problema na
prxima figura.

Considerando o trabalho para transferir apenas trs discos, fcil compreender por
que os sacerdotes de Hani acreditavam que o tempo necessrio para transferir os 64
discos seria igual ao tempo que restava para o fim do mundo. De fato possvel provar
que o mnimo de movimentos para resolver o problema com n discos igual a 2n-1.
DESAFIO: verificar se o algoritmo recursivo abaixo resolve o problema das Torres
de Hani.
void hanoi(int nr_discos, char de, char para, char apoio)
{
if(nr_discos == 1){
printf(Mova disco de %c para %c., de, para);
return;
}else{
hanoi(nr_discos 1, de, apoio, para);
printf(Mova disco de %c para %c., de, para);
hanoi(nr_discos 1, apoio, para, de);
}
}

Pgina 4

5. LISTA DE EXERCCIOS
ORIENTAO:
salvar
cada
exerccio
abaixo
em
um
arquivo
denominado
exercicio_<letra do exerccio>.c, conforme modelo enviado pelo professor, e depois compactar
todos os cdigos em um arquivo denominado <nmero do seu RA>.zip e enviar por e-mail para
sergiodcf@anhanguera.com.

a) Usando apenas subtrao, crie uma funo recursiva para calcular o resto da
diviso de um nmero m (natural) por um nmero n (natural positivo).
b) Usando apenas subtrao, crie uma funo recursiva para determinar se um
nmero n (natural) par ou no.
c) Crie uma funo recursiva para converter uma string de dgitos em um nmero
natural. Por exemplo, a chamada nat(123) retorna o nmero 123.
d) Crie uma funo recursiva para inverter uma string. Por exemplo, a chamada
inv(roma) retorna amor.
e) Converta a rotina iterativa abaixo para uma forma recursiva.
int rotina(int n)
{
int s=0;
while(n>0){
s=s+1;
n--;
}
return(s);
}
f) Crie uma funo recursiva para calcular a soma dos n primeiros termos de uma
srie harmnica, ou seja, 1 + 1/2 + 1/3 + + 1/n, onde n natural positivo.
g) Construa uma rotina recursiva para converter um nmero n natural de base
decimal para a base binria.
h) Seja uma linguagem hipottica na qual no existem operadores para adio e
subtrao. Sabe-se que nesta linguagem existe uma funo suc(n), que retorna o
sucessor de um nmero n, e uma funo pred(n), que retorna o predecessor de n.
Usando apenas estas funes suc e pred, defina uma funo recursiva add(x,y), que
recebe como argumentos os naturais x e y e retorna a soma deles.

Pgina 5

i) Construa um vetor que receba dez nmeros inteiros e algoritmos recursivos para
calcular:
- o maior elemento do vetor.
- o menor elemento do vetor.
- a soma dos elementos do vetor.
- o produto dos elementos do vetor.
- a mdia dos elementos do vetor.
6. BIBLIOGRAFIA

PEREIRA, Silvio do Lago. Estrutura de Dados Fundamentais: Conceitos e


Aplicaes. 9 ed. So Paulo: rica, 2006.

SILVA, Osmar Quirino da.. Estrutura de Dados e Algoritmos Usando C:


Fundamentos e Aplicaes. 1 ed. Rio de Janeiro: Cincia Moderna, 2007.

TANENBAUM, A.; LANGSAM, Yedidyah; AUGENSTEIN, Moshe J.. Estrutura de


Dados usando C. 1 ed. So Paulo: Pearson, 2007.

Pgina 6

You might also like