Você está na página 1de 31

CEFETMGEngenhariadeComputao

Recursoe
AnlisedeComplexidadede
AlgoritmosRecursivos

AlgoritmoseEstruturasdeDadosI
2009/2

Sumrio

Conceitomatemticoderecurso

Conceitocomputacionalderecurso

Vantagensedesvantagensdarecurso

Aplicaesdarecurso

Anlisedecomplexidadedealgoritmosrecursivos

Resoluoderelaesderecorrncia

Recurso

Objetosrecursivos

Conceitomatemticoderecurso
Umafunorecursivaumafunoparcialmentedefinidaem
termosdesimesma

Funofatorial

SriedeFibonacci:0,1,1,2,3,5,8,13,21,
34,55,89,144,233,377,610,987,1597,...

Oprprioelemento
definidoaparecena
definio...

Somadosprimeirosnmerosnaturais

Conceitomatemticoderecurso

Funofatorial
Condiode
terminao
partefundamental
dadefinio

SriedeFibonacci

Somadosprimeirosnmerosnaturais

Conceitocomputacionalderecurso
Umprocedimentorecursivoaquelequechamaasimesmo
diretaouindiretamente

intabc(){
......
......
xyz();
......
}

intabc(){
......
......
abc();
......
}
Recursodireta

Recursoindireta

intxyz(){
......
......
abc();
......
}

Conceitocomputacionalderecurso
Recursoindireta

Funofatorialrecursivarecursodireta
/*entrada:inteironnonegativo
resultado:retornaofatorialden
*/
longfatorial(intn){
if((n==0)||(n==1))//condiodeterminao
return1;
else//casorecursivo
return(n*fatorial(n1));
}

Funofatorialrecursivaexecuo
/*

Exemplo:fatorialde5

entrada:inteironnonegativo
resultado:retornaofatorialden

5!=5*4!

*/

4!=4*3!

longfatorial(intn){

3!=3*2!
2!=2*1!

if((n==0)||(n==1))

1!=1

return1;
else
return(n*fatorial(n1));
}

Funofatorialrecursivaexecuo
Chamadasdefunoeusodamemria

retorna1
fat(1)

temp=5*4!
fat(5)

temp=2*1!
fat(2)

temp=2*1!
fat(2)

temp=3*2!
fat(3)

temp=3*2!
fat(3)

temp=3*2!
fat(3)

temp=4*3!
fat(4)

temp=4*3!
fat(4)

temp=4*3!
fat(4)

temp=4*3!
fat(4)

temp=5*4!
fat(5)

temp=5*4!
fat(5)

temp=5*4!
fat(5)

temp=5*4!
fat(5)

Tempodeexecuo

CadachamadadefunodenominadaATIVAOdafuno

Usode
memria
e
chamadas
de
funo

Conceitocomputacionalderecurso
Umprocedimentorecursivoaquelequechamaasimesmo
diretaouindiretamente ou,deformaequivalente:

Umafunorecursivaseumanovaativaopodecomear
antesqueumaativaoanteriordamesmafunotenha
terminado

Ativaodefunoepilhadememria
Todavezqueumafunoativada,elacarregadanamemriae
espaoreservadopara

variveislocais,parmetrosdafuno,variveistemporriascriadas
automaticamentepelosistemaparaarmazenarclculosintermedirios,
endereoderetorno(quemchamou?)
oestadocorrentedacomputaodeveserarmazenadoparapermitira
voltadachamadarecursiva:prosseguimentodaexecuodoprograma
requerumachamadadesistema(sistemaoperacional)
=>maiortempodeexecuo

Nocasodafunorecursiva:

Paracadachamada,umnovoespaoalocadonamemria!

pilhaderecurso:cadaativaoempilhadanamemria

Ocustodaschamadaselevado:custodarecurso

tempodeexecuoeespaoemmemria

Condiodeparadaouterminao
Devesercuidadosamenteexplicitadaparaevitar
infinitaschamadasrecursivas

naprtica:oprogramafinalizariaporfaltade
memria

Anlisedonmerodechamadasrecursivas

Profundidadedarecurso:nmeromximode
chamadasdefunoempilhadasdurantea
execuodafuno
Exemplo:fatorial(n):nchamadasdafuno
empilhadas

retorna1
fat(1)
temp=2*1!
fat(2)
temp=3*2!
fat(3)
temp=4*3!
fat(4)
temp=5*4!
fat(5)

SriedeFibonacci:versoiterativa
SriedeFibonacci:
0,1,1,2,3,5,8,13,21,34,55,89,144...

unsignedlongfib(intn){
unsignedlongatual,menos1=1,menos2=0;
if(n<=1)returnn;
else
for(inti=2;i<=n;i++){
atual=menos1+menos2;
menos2=menos1;
menos1=atual;
}
returnatual;
}

SriedeFibonacci:versorecursiva
unsignedlongfibrec(intn){
if(n<=1)
returnn;
else
returnfibrec(n1)+fibrec(n2);
}

rvorederecurso

Observema
repetiode
clculosde
termos

Fibonaccirecursivo:
nmerodechamadaseprofundidadedarecurso
chamada#1
chamada#2
chamada#3
chamada#4
chamada#5
chamada#6
chamada#7
chamada#8
chamada#9
chamada#10
chamada#11
chamada#12
chamada#13
chamada#14
chamada#15
Ovalorfinale'5

0,1,1,2,3,5

SriedeFibonacci:nmerodesomas
termovalor
#somas #somasrec
00=0

0
0
11=1

0
0
21=1

1
1
32=2

2
2
43=3
3
4
55=5
4
7
68=8
5
12
713=13
6
20
821=21
7
33
934=34
8
54
1055=55
9
88
1189=89
10
143
12144=144
11
232
13233=233
12
376
14377=377
13
609
15610=610
14
986
16987=987
15
1596
171597=1597
16
2583
182584=2584
17
4180
194181=4181
18
6764
206765=6765
19
10945
...
3724157817=2415781736 39088168
3839088169=3908816937 63245985
3963245986=6324598638
102334154

40102334155=10233415539 165580140

Nmerodesomas
executadasnas
versesrecursivae
norecursivada
funo

Vantagensedesvantagensdarecurso
Vantagens

Desvantagens

tcnicadeprogramaoverstile
poderosa

permitedefinirumconjuntoinfinito
deobjetoscomumcomandofinito

ajudaadescreverestruturasde
dadoseficienteseelegantes

podeoferecerumamaneira
eleganteeconcisaparaexpressar
umasoluorecursivaparaum
problema
aversorecursivadeum
programapodesermuitomais
simplesdoqueaversono
recursiva

custo:chamadasdefuno
sodemoradas
searecursoforeliminadao
programapodeexecutarmais
rpido
custo:gastoadicionalde
memria
oprogramapodeterminarpor
faltadememria
condiodeterminaopode
sercausadeerros
umalgoritmorecursivopode
serterrivelmenteineficiente

Aplicaodarecurso
arecursoumatcnicacomputacionalextremamentepoderosa,
tileverstil

ajudaadescreveralgoritmoseestruturasdedadosdenatureza
recursiva,demaneiraeficienteeelegante

ex:rvoresestruturasdedadosealgoritmos

muitosalgoritmosinteressantessoexpressosdeformabastante
simplesusandoarecurso

ex:quicksort

aplicao:paraproblemase/ouestruturasdedadosdenatureza
recursiva,quenotenhamimplementaosimplesnorecursiva

nuncadeveserusadanolugardeumlaosimples

Implementaodarecurso
Paraevitarlaosinfinitosprecisodefinirbemascondiesde
finalizaodarecurso

Problemadaterminao:tratadedefinirumacondiode
terminao

emgeral,umprocedimentorecursivoPrecebeumparmetrone
chamadorecursivamenteparaP(m)ondem<n
devesegarantirqueacondiodeterminaoseralcanada

onmerodevezesqueafunorecursivaserchamadadeveser
umnmeropequenoeconhecido

Umaconcluso:prefiraiteraosempreque
possvel
Quandonousararecurso

longfatorial(intn){
intk;
longresultado=1;
for(k=2;k<=n;k++)
resultado=resultado*k;
returnresultado;
}

AsfunesfatorialeFibonacci
NUNCAdevemser
implementadasdemaneira
recursiva

quandoumlaopode
substituilaperfeitamente
exemplos:funofatoriale
funodeFibonacci
atenopararecursode
cabeaecauda

achamadarecursivavem
noincioounofimdo
cdigo:podeserfacilmente
transformadaemlao

AsimplementaesrecursivasdefatorialeFibonaccisousadassomenteparafinsdidticos

Anlisedecomplexidadedealgoritmosrecursivos
Otempodeexecuodeumalgoritmorecursivopodeserexpresso
porumarelaoderecorrncia

Umarelaoderecorrnciaumaequaoouinequaoque
descreveumafunoemtermosdeseusvaloressobreentradas
menores

Umarelaoderecorrnciacompostaporduaspartes

casobase

oresultadodarelaoparavalorespequenosden,quandonenhuma
chamadarecursivafeita

casoindutivo

expressaacondiodeterminaodadefiniorecursiva

parteemqueostermosdasequnciasodefinidosemfunodostermos
menores
expressaaschamadasrecursivasdafuno

Expressandoocustoemrelaesderecorrncia
Otempodeexecuodeumalgoritmorecursivousualmente
denominadoT(n)

Exemplo:paraafunofatorial

sejaT(n)onmerodemultiplicaesexecutadopelafuno
fatorialrecursiva
ocustodaexecuoexpressopelarelaoderecorrncia

Maisexemplosderelaesderecorrncia

Analisandoalgoritmosrecursivos
Etapasdaanlisedecomplexidadedealgoritmosrecursivos

1) definaT(n)comoafunodecomplexidadedetempodoalgoritmo,para
umaentradadetamanhon
2) analiseoalgoritmoeencontreocustoparaocasobase
3) analiseoalgoritmoeencontreocustoparaaparterecursiva
4) apresentearelaoderecorrncia
5) resolvaarelaoderecorrncia

Asoluodeumarelaoderecorrnciaumafrmulafechada

paraqualquervalorden,ocustopodesercalculadocomumnmerofixo
deoperaeselementares
hvriastcnicaspararesolverrelaesderecorrncia

ex:mtododaiterao:expandirT(n)atidentificarumpadro

Exemplodesoluo1

Somaros
termoslado
alado

Exemplodesoluo2

Exemplodesoluo3

Exemplodesoluo4

Exercciosesitessobrerecurso
Exerccios:resolverasseguintesrelaesderecorrncia

Ateno:algoritmosanimadosderecursoepginassobrerecurso:
verlinksnapginadadisciplinanoMoodle

Você também pode gostar