Escolar Documentos
Profissional Documentos
Cultura Documentos
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