Documente Academic
Documente Profesional
Documente Cultură
Linguagens de Programao II
Recursividade
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
3! 3 2 1
1! 1
4! 4 3 2 1
2! 2 1
5! 5 4 3 2 1
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
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);
}
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
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
Aula 5 - 14
Aula 5 - 15
Probabilidade e Estatstica
Dany Sanchez Dominguez LP2
Aula 5 - 16
1, 1,
Aula 5 - 17
Aula 5 - 18
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
Aula 5 - 20
Fi(4)
Fi(3)
Fi(3)
Fi(2)
Fi(2)
Fi(2)
1
Fi(1)
1
Fi(1)
Aula 5 - 21
Aula 5 - 22
Aula 5 - 23
Aula 5 - 24
Aula 5 - 25
Recursivo vs Iterativo
Para
cada
algoritmo
recursivo
existe
um
claramente
as
definies
matemticas,
Algoritmos iterativos so mais eficientes,
recursos
(memria
processador),
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)
Aula 5 - 27
a aaa
n
a aa
n
n1
a a
a
1
n
n 1
n0
n0
definio recursiva
condio de parada
Aula 5 - 28
Aula 5 - 29
pot_rec(2, 4)
16
pot_rec(2, 3)
pot_rec(2, 2)
pot_rec(2, 1)
pot_rec(2, 0)
Aula 5 - 30
Retorno
Aula 5 - 31
criado
pelo
matemtico
francs
Aula 5 - 32
Aula 5 - 33
C
B
A
Problema principal: Mover 4 discos da torre A
para a torre C.
Dany Sanchez Dominguez LP2
Aula 5 - 34
A
Dany Sanchez Dominguez LP2
Aula 5 - 35
Aula 5 - 36
A
Dany Sanchez Dominguez LP2
Aula 5 - 37
Condio de parada:
se numero de discos = 1, faz o movimento
diretamente
Dany Sanchez Dominguez LP2
Aula 5 - 38
Aula 5 - 39
disco
disco
disco
disco
disco
disco
disco
disco
disco
disco
disco
disco
disco
disco
disco
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
A
Dany Sanchez Dominguez LP2
C
Aula 5 - 41
A
Dany Sanchez Dominguez LP2
C
Aula 5 - 42
A
Dany Sanchez Dominguez LP2
C
Aula 5 - 43
A
Dany Sanchez Dominguez LP2
C
Aula 5 - 44
A
Dany Sanchez Dominguez LP2
C
Aula 5 - 45
A
Dany Sanchez Dominguez LP2
C
Aula 5 - 46
A
Dany Sanchez Dominguez LP2
C
Aula 5 - 47
A
Dany Sanchez Dominguez LP2
C
Aula 5 - 48
A
Dany Sanchez Dominguez LP2
C
Aula 5 - 49
A
Dany Sanchez Dominguez LP2
C
Aula 5 - 50
A
Dany Sanchez Dominguez LP2
C
Aula 5 - 51
A
Dany Sanchez Dominguez LP2
C
Aula 5 - 52
A
Dany Sanchez Dominguez LP2
C
Aula 5 - 53
A
Dany Sanchez Dominguez LP2
C
Aula 5 - 54
A
Dany Sanchez Dominguez LP2
C
Aula 5 - 55
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
Assumindo
que
os
monges
realizem
Aula 5 - 57
strlen()
da biblioteca padro e
while,
do..while).
Aula 5 - 58
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
procurado,
procurar
nos
N-1
elementos
restantes.
Dany Sanchez Dominguez LP2
Aula 5 - 60
Valor encontrado
Extremo esquerdo > Extremo direito
Dany Sanchez Dominguez LP2
Aula 5 - 61
Aula 5 - 62
Comentrios
No se aprende recursividade sem praticar
problema
em
problemas
menores,
sucessivas
chamadas
recursivas
levam
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
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
Aula 5 - 65
Recursividade