Sunteți pe pagina 1din 66

Universidade Estadual de Santa Cruz

Colegiado de Cincia da Computao

Linguagens de Programao II
Recursividade

Dany Sanchez Dominguez


dsdominguez@gmail.com
Sala 1 NBCGIB
Dany Sanchez Dominguez LP2

Aula 5 - 1

Definio de Recursividade
Um objeto denominado recursivo quando sua
definio parcialmente feita em termos dele
mesmo.
Uma funo ou procedimento dito recursivo
(ou apresenta recursividade) se for definido em
termos de si prprio.
Em programao, a recursividade um
mecanismo til e poderoso que permite a uma
funo chamar a si mesma direta ou
indiretamente.
Dany Sanchez Dominguez LP2

Aula 5 - 2

Exemplo - Fatorial
Definio matemtica (n!):
n 1
n i n (n 1)
n ! i 0
1

(2) (1),

se n 0

se n 0

Podemos expressar o fatorial dos primeiros


nmeros naturais na forma:
0! 1

3! 3 2 1

1! 1

4! 4 3 2 1

2! 2 1

5! 5 4 3 2 1

Dany Sanchez Dominguez LP2

Aula 5 - 3

Exemplo - Fatorial
Seguindo o procedimento anterior impossvel
listar a frmula de fatorial para cada nmero
natural (invivel para valores grandes).
A definio anterior define um conjunto infinito
com comandos infinitos.
Chamaremos a definio anterior como
definio no-recursiva de fatorial.
A definio no-recursiva pode ser utilizada
para criarmos um algoritmo iterativo para o
calculo do fatorial.
Dany Sanchez Dominguez LP2

Aula 5 - 4

Exemplo - Fatorial
Fatorial Iterativo:
int fatorial_ite(int);
int fatorial_ite(int n){
int i, result;
result = 1;
for(i=n;i>0;i--)
result *= i;

return result;
}

Execuo do algoritmo.
Dany Sanchez Dominguez LP2

Aula 5 - 5

Exemplo - Fatorial
Vamos a examinar detalhadamente a definio
de fatorial:
0! 1
1! 1
1! 1 0!
2! 2 1
2! 2 1!
3! 3 2 1
3! 3 2!
4! 4 3 2 1
4! 4 3!
5! 5 4 3 2 1
5! 5 4!
Concluso: n! n n 1!
Dany Sanchez Dominguez LP2

para n 0
Aula 5 - 6

Exemplo - Fatorial
Definio recursiva (n!):
n (n 1)!,
n!
,
1

se n 0
se n 0

Usando a definio anterior possvel expressar


o fatorial de qualquer nmero natural,
A definio anterior recursiva!!!
Define uma funo em termos dela mesma
(aparentemente circular)
Define um conjunto infinito com comandos

finitos
Dany Sanchez Dominguez LP2

Aula 5 - 7

Exemplo - Fatorial
Usando a definio anterior podemos escrever
um algoritmo recursivo para o clculo do
fatorial.
Fatorial Recursivo:
int fatorial_rec(int n){
if (n==0)
return 1;
else
return n*fatorial_rec(n-1);
}

Dany Sanchez Dominguez LP2

Aula 5 - 8

Exemplo - Fatorial
Execuo do algoritmo recursivo para n = 4.
fatorial_rec (4)
fatorial_rec (3)
fatorial_rec (2)

Endereo de Clulas de
memria
memria
1024

n=4

1056

n=0

fatorial_rec (0)

1088

n=2

return 1

1120

fatorial_rec (1)

return 1 * 1
return 2 * 1
return 3 * 2
return 4 * 6
Dany Sanchez Dominguez LP2

1152

n=1

1184
1216

n=3

1238
Aula 5 - 9

Recursividade
A recursividade pode ser utilizada quando um
problema puder ser definido em termos de si
prprio,
Uma funo dita recursiva se ela contm pelo
menos uma chamada explcita ou implcita a si
prpria,
Uma funo recursiva chama ela mesma, mas
com outros parmetros,
Algoritmos recursivos so baseados no
paradigma de dividir e conquistar,
Dany Sanchez Dominguez LP2

Aula 5 - 10

Recursividade
As tcnicas de dividir e conquistar, preconizam
obter a soluo de um problema complexo,
dividindo este em problemas mais simples,
A idia bsica de um algoritmo recursivo
consiste em diminuir sucessivamente o
problema em um (ou vrios) problema(s)
menor(es) ou mais simples,
Em cada etapa da recurso o universo do
problema diminudo,
Dany Sanchez Dominguez LP2

Aula 5 - 11

Recursividade
O problema simplificado at que o tamanho

do mesmo permita resorve-l de forma direta


(sem recorrer a recursividade),

Quando o problema resolvido diretamente,


porque a condio de parada foi alcanada,
A condio de parada ou casso bsico permite
finalizar o processo recursivo,
Exemplo de fatorial, casso bsico para n = 0,
Dany Sanchez Dominguez LP2

Aula 5 - 12

Recursividade
Procedimentos recursivos, que no atingem a
condio de parada, levam a programas
infinitos que estouram a memria do
computador,
Um algoritmo recursivo formado por:
condio de parada: o problema resolvido
diretamente (casso bsico),
outros comandos: resolvem o problema
chamando novamente a funo recursiva.
Dany Sanchez Dominguez LP2

Aula 5 - 13

Problemas associados a recurso


Recurses que no terminam!!!
Um requisito fundamental que a chamada
recursiva esteja sujeita uma condio
booleana que em um determinado momento ir
se tornar falsa e no mais ativar a recurso
(condio de parada!).
Um
subprograma
recursivo
deve
ter
obrigatoriamente uma condio que controla
sua execuo ou trmino, sob pena de produzir
uma computao interminvel.
Dany Sanchez Dominguez LP2

Aula 5 - 14

Ex. Seqncia de Fibonacci


Os estudos sobre a seqncia de Fibonacci
datam do sculo XI, e foram feitas por
Leonardo de Pisa (Fibonacci=filius Bonacci),
A mesma tem aplicaes teoricas e prticas na
medida que muitos padres da natureza
parecem segui-la,

Dany Sanchez Dominguez LP2

Aula 5 - 15

Ex. Seqncia de Fibonacci


Entre as principais aplicaes temos:
Estudo genealgico de coelhos

Estudo genealgico de abelhas


Comportamento da luz
Comportamento de tomos
Crescimento de plantas
Asceno e queda em bolsas de valores

Probabilidade e Estatstica
Dany Sanchez Dominguez LP2

Aula 5 - 16

Ex. Seqncia de Fibonacci


A seqncia de Fibonacci definida como:
1. uma sequncia de nmeros inteiros onde
cada elemento a soma dos dois nmeros
anteriores,
2. os dois primeiro elementos so iguais a 1.
Os primeiros valores da seqncia:

1, 1,

2, 3, 5, 8, 13, 21, 34, 55,

Dany Sanchez Dominguez LP2

Aula 5 - 17

Ex. Seqncia de Fibonacci


Aplicaes, crescimento de plantas (nro. galhos):

Dany Sanchez Dominguez LP2

Aula 5 - 18

Ex. Seqncia de Fibonacci


Definio recursiva da seqncia de Fibonacci:

1,
n 1

Fi n 1,
n2
F n 1 F n 2 , n 2
i

i
A seqncia de Fibonacci definida
recursivamente em funo de duas instancias
anteriores da prpria seqncia,
porm a condio de parada contempla dois
casos bases, n=1 e n=2.
Dany Sanchez Dominguez LP2

Aula 5 - 19

Ex. Seqncia de Fibonacci


Algoritmo recursivo para calcular o n-esimo
termo da seqncia de Fibonacci:
int fibonacci_rec(int);

int fibonacci_rec(int n){


if (n==1 || n==2) //condio de parada
return 1;
else
return fibonacci_rec(n-1)+fibonacci_rec(n-2);
}

Dany Sanchez Dominguez LP2

Aula 5 - 20

Ex. Seqncia de Fibonacci


Arvore de recursso do algoritmo para n = 5
Fi(5)
5

Fi(4)

Fi(3)

Fi(3)

Fi(2)

Fi(2)

Fi(2)
1

Fi(1)
1

Fi(1)

Dany Sanchez Dominguez LP2

Aula 5 - 21

Ex. Seqncia de Fibonacci


Arvore de recursso so ties para analizar e
comprender o funcionamento de algoritmos
recursivos,
Note que para cada chamada com n>2 duas
novas chamadas recursivas so feitas,
O
nmero
de
chamadas
cresce
exponencialmente,
Para n=5 so feitas 9 chamadas a funo,
Adicionalmente Fi(3) e Fi(1) so chamadas trs
vezes e Fi(2) chamada duas vezes,
Dany Sanchez Dominguez LP2

Aula 5 - 22

Ex. Seqncia de Fibonacci


A implementao recursiva para calcular o nsimo elemento da seqncia de Fibonacci
mostrou-se muito ineficiente,
possvel obtermos um algoritmo iterativo para
fazer essa tarefa?
Escreva um algoritmo iterativo para calcular o
n-esimo termo da seqncia.
Dany Sanchez Dominguez LP2

Aula 5 - 23

Ex. Seqncia de Fibonacci


Fibonacci iterativo:
int fibonacci_ite(int n){
int i, F1, F2, F;
if (n==1 || n==2)
return 1;
F1 = F2 = 1;
for(i=2;i<n;i++){
F = F1 + F2;
F2 = F1;
F1 = F;
}
return F;}
Dany Sanchez Dominguez LP2

Aula 5 - 24

Ex. Seqncia de Fibonacci


Fibonacci iterativo:
int fibonacci_ite(int n){
int i, F1, F2, F;
F = F1 = F2 = 1;
for(i=2;i<n;i++){
F = F1 + F2;
F2 = F1;
F1 = F;
}
return F;}

Dany Sanchez Dominguez LP2

Aula 5 - 25

Recursivo vs Iterativo
Para

cada

algoritmo

recursivo

existe

um

algoritmo iterativo que executa a mesma tarefa,


Algoritmos recursivos so mais elegantes e
reproduzem

claramente

as

definies

matemticas,
Algoritmos iterativos so mais eficientes,

Algoritmos recursivos quase sempre consomem


mais

recursos

(memria

processador),

sobrecarga pelas chamadas a funo.


Dany Sanchez Dominguez LP2

Aula 5 - 26

Recursivo vs Iterativo
algoritmos recursivos so mais difceis de serem
depurados, especialmente quando for alta a
profundidade de recurso,
Para alguns problemas (recursivos por natureza)

acharmos um algoritmo iterativo uma tarefa


dficil.

Dany Sanchez Dominguez LP2

Aula 5 - 27

Ex. Clculo de Potncia


Escreva uma funo recursiva que implemente a
operao an onde n um nmero inteiro positivo.

a aaa
n

a aa
n

n1

a a
a

1
n

Dany Sanchez Dominguez LP2

n 1

n0
n0

definio recursiva

condio de parada
Aula 5 - 28

Ex. Clculo de Potncia


float potencia_rec(float, int);
float potencia_rec(float a, int n){
if (n==0)
return 1;
else
return a*potencia_rec(a, n-1);
}

Construa a rvore de recurso para o algoritmo


anterior considerando a = 2 e n = 4.

Dany Sanchez Dominguez LP2

Aula 5 - 29

Ex. Clculo de Potncia


rvore de recurso a=2 e n=4

Dany Sanchez Dominguez LP2

pot_rec(2, 4)

16

pot_rec(2, 3)

pot_rec(2, 2)

pot_rec(2, 1)

pot_rec(2, 0)

Aula 5 - 30

Ex. Torres de Hanoi


Durante o reinado do imperador Fo Hi, existia

um templo que marcaria o centro do universo.


Dentro deste templo, alguns monges moviam
discos de ouro entre 3 torres de diamante. Deus
colocou 64 discos de ouro em uma das torres na
hora da criao do universo. Diz-se que, quando
os monges completarem a tarefa de transportar
todos os discos para a terceira torre, o universo
terminar. Quanto tempo demoraram os monges
para completar a tarefa?
Dany Sanchez Dominguez LP2

Retorno

Aula 5 - 31

Ex. Torres de Hanoi


Problema

criado

pelo

matemtico

francs

Edouard Lucas, em 1883;


3 torres (A, B e C);

n discos de vrios tamanhos na torre A


(colocados em ordem decrescente segundo o
tamanho);
Objetivo: transportar os n discos da torre A para
a torre B;
Dany Sanchez Dominguez LP2

Aula 5 - 32

Ex. Torres de Hanoi


Regras:
nunca colocar um disco maior sobre um disco
menor;
pode-se mover um nico disco por vez;
nunca colocar um disco em outro lugar que
no numa das trs hastes.

Dany Sanchez Dominguez LP2

Aula 5 - 33

Ex. Torres de Hanoi


Problema para 4 discos:

C
B
A
Problema principal: Mover 4 discos da torre A
para a torre C.
Dany Sanchez Dominguez LP2

Aula 5 - 34

Ex. Torres de Hanoi


Recurso: simplificar o problema.
Mover 4 discos da torre A para a torre C
Mover 3 discos de A para B
Mover 1 disco de A para C
Mover 3 discos de B para C

A
Dany Sanchez Dominguez LP2

Aula 5 - 35

Ex. Torres de Hanoi


Logo o problema principal:
Mover 4 discos da torre A para a torre C
Se transforma em dois problemas menores:
mover 3 discos da torre A para a torre B;
mover 1 disco da torre A para a torre C;
mover 3 discos da torre B para a torre C.
Mas, como mover 3 discos?
Dany Sanchez Dominguez LP2

Aula 5 - 36

Ex. Torres de Hanoi


Mover 3 discos da torre A para a torre B
Mover 2 discos de A para C
Mover 1 disco de A para B
Mover 2 discos de C para B

A
Dany Sanchez Dominguez LP2

Aula 5 - 37

Ex. Torres de Hanoi


Funo recursiva geral, mover n discos da torre
A para a torre C
mover (n-1) discos, da torre A para a torre B
mover 1 disco da torre A para a torre C
mover (n-1) discos, da torre B para a torre C

Condio de parada:
se numero de discos = 1, faz o movimento
diretamente
Dany Sanchez Dominguez LP2

Aula 5 - 38

Ex. Torres de Hanoi


Funo recursiva:
void torres_hanoi(int, char, char, char);
void torres_hanoi(int n, char orig, char dest, char aux){
if (n==1){
printf("Mover disco de %c para %c\n", orig, dest);
return;
}
torres_hanoi(n-1, orig, aux, dest);
torres_hanoi(1, orig, dest, aux);
torres_hanoi(n-1, aux, dest, orig);
}

Dany Sanchez Dominguez LP2

Aula 5 - 39

Ex. Torres de Hanoi


Sada:
Mover
Mover
Mover
Mover
Mover
Mover
Mover
Mover
Mover
Mover
Mover
Mover
Mover
Mover
Mover

disco
disco
disco
disco
disco
disco
disco
disco
disco
disco
disco
disco
disco
disco
disco

Dany Sanchez Dominguez LP2

de
de
de
de
de
de
de
de
de
de
de
de
de
de
de

A
A
B
A
C
C
A
A
B
B
C
B
A
A
B

para
para
para
para
para
para
para
para
para
para
para
para
para
para
para

B
C
C
B
A
B
B
C
C
A
A
C
B
C
C
Aula 5 - 40

Ex. Torres de Hanoi


Mover disco de A para B

A
Dany Sanchez Dominguez LP2

C
Aula 5 - 41

Ex. Torres de Hanoi


Mover disco de A para C

A
Dany Sanchez Dominguez LP2

C
Aula 5 - 42

Ex. Torres de Hanoi


Mover disco de B para C

A
Dany Sanchez Dominguez LP2

C
Aula 5 - 43

Ex. Torres de Hanoi


Mover disco de A para B

A
Dany Sanchez Dominguez LP2

C
Aula 5 - 44

Ex. Torres de Hanoi


Mover disco de C para A

A
Dany Sanchez Dominguez LP2

C
Aula 5 - 45

Ex. Torres de Hanoi


Mover disco de C para B

A
Dany Sanchez Dominguez LP2

C
Aula 5 - 46

Ex. Torres de Hanoi


Mover disco de A para B

A
Dany Sanchez Dominguez LP2

C
Aula 5 - 47

Ex. Torres de Hanoi


Mover disco de A para C

A
Dany Sanchez Dominguez LP2

C
Aula 5 - 48

Ex. Torres de Hanoi


Mover disco de B para C

A
Dany Sanchez Dominguez LP2

C
Aula 5 - 49

Ex. Torres de Hanoi


Mover disco de B para A

A
Dany Sanchez Dominguez LP2

C
Aula 5 - 50

Ex. Torres de Hanoi


Mover disco de C para A

A
Dany Sanchez Dominguez LP2

C
Aula 5 - 51

Ex. Torres de Hanoi


Mover disco de B para C

A
Dany Sanchez Dominguez LP2

C
Aula 5 - 52

Ex. Torres de Hanoi


Mover disco de A para B

A
Dany Sanchez Dominguez LP2

C
Aula 5 - 53

Ex. Torres de Hanoi


Mover disco de A para C

A
Dany Sanchez Dominguez LP2

C
Aula 5 - 54

Ex. Torres de Hanoi


Mover disco de B para C

A
Dany Sanchez Dominguez LP2

C
Aula 5 - 55

Ex. Torres de Hanoi


rvore de recurso:
TH(4)

TH(2)

TH(2)

TH(1)

TH(1)TH(1) TH(1)

TH(3)

TH(1)

TH(3)

TH(1)TH(1) TH(1)

TH(2)

TH(1)

TH(1)TH(1) TH(1)

TH(2)

TH(1)TH(1) TH(1)

Nmero de movimentos = 15
Profundidade da recurso: 4
Nmero de movimentos = 2n-1
Dany Sanchez Dominguez LP2

Aula 5 - 56

Ex. Torres de Hanoi


Retornando a lenda dos monges ... (enlace)
Quantidade de movimentos necessrios para
acabar o universo: 264-1 = 18446744073709551616,

Assumindo

que

os

monges

realizem

movimento por segundo, e no cometam erros,

eles iro levar um total de


18446744073709551616 585,000,000,000 anos
Dany Sanchez Dominguez LP2

Aula 5 - 57

Ex. Comprimento de string


Escreva uma funo que receba uma string e
retorne seu comprimento, sua funo no pode
utilizar a funo

strlen()

da biblioteca padro e

no pode conter nenhum lao (for,

while,

do..while).

Sugesto: Utilize recursividade, e considere que

se retirarmos o primeiro caractere da string o


tamanho total 1 + tamanho do resto da string.
Dany Sanchez Dominguez LP2

Aula 5 - 58

Ex. Comprimento de string


int strlen_rec(char *);

int main(){
char str[] = Recursividade";
printf("Comprimento: %d\n", strlen_rec(str));

system("PAUSE");
return 0;
}
int strlen_rec(char * ch){
if (!(*ch)) //condio de parada
return 0;
else
return 1 + strlen_rec(++ch);
}
Dany Sanchez Dominguez LP2

Aula 5 - 59

Ex. Busca seqencial


Escreva uma funo recursiva que receba os
elementos de um vetor e um valor a ser
procurado, a funo deve retornar 1 se o valor
estiver no vetor 0 se no estiver.
Sugesto: A busca em N elementos significa
olhar para o 1 elemento. Se no for o elemento

procurado,

procurar

nos

N-1

elementos

restantes.
Dany Sanchez Dominguez LP2

Aula 5 - 60

Ex. Busca seqencial


Parmetros da funo:
Valor a ser procurado (val)
Elementos do vetor (v)
Extremo esquerdo do conjunto (ee)

Extremo direito do conjunto (ed)


Condio de parada:

Valor encontrado
Extremo esquerdo > Extremo direito
Dany Sanchez Dominguez LP2

Aula 5 - 61

Ex. Busca seqencial


int busca_rec(int, int, int, int *);

int busca_rec(int ee, int ed, int val, int *v){


if (ee>ed)
return 0;
if (v[ee] == val)
return 1;
return busca_rec(ee+1, ed, val, v);
}

Dany Sanchez Dominguez LP2

Aula 5 - 62

Comentrios
No se aprende recursividade sem praticar

Para montar um algoritmo recursivo:


Defina pelo menos um caso bsico (condio de
parada);
Quebre

problema

em

problemas

menores,

definindo o(s) caso(s) com recurso(es)


Fazer o teste de finitude, isto , certificar-se de que
as

sucessivas

chamadas

recursivas

levam

obrigatoriamente, e numa quantidade finita de vezes,

ao(s) caso(s) bsico(s)


Dany Sanchez Dominguez LP2

Aula 5 - 63

Comentrios
Vantagens:
Reduo do tamanho do cdigo fonte,
Permite descrever algoritmos de forma mais clara e
concisa,
Os algoritmos recursivos normalmente so mais
compactos, mais legveis e mais fceis de serem
compreendidos,
Reproduzem claramente as definies matemticas

Dany Sanchez Dominguez LP2

Aula 5 - 64

Comentrios
Desvantagens:
Reduo do desempenho de execuo devido ao
tempo para gerenciamento de chamadas
Dificuldades na depurao de programas recursivos,
especialmente se a recurso for muito profunda

Dany Sanchez Dominguez LP2

Aula 5 - 65

Recursividade

Maurits Cornelis Escher (1898-1972)


Matemtico e Artista Plstico
Fonte: http://www.mcescher.com/

S-ar putea să vă placă și