Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Claudio Esperana
Recurso
umprincpiomuitopoderosoparaconstruode
algoritmos
Asoluodeumproblemadivididoem
Casossimples:
Casosgerais:
Semelhanteprovadeteoremasporinduo
Funo recursiva
Implementaumalgoritmosrecursivoondeasoluodoscasos
genricosrequeremchamadasprpriafuno
Umafunorecursivaamaneiramaisdireta(masno
necessariamenteamelhor)deseresolverproblemasdenatureza recursivaouparaimplementarestruturasdedadosrecursivas
Considere,porexemplo,adefiniodaseqnciadeFibonacci:
Oprimeiroeosegundotermovalem0e1,respectivamente Oisimotermoasomado(i1)simoeo(i2)simotermo
>>> def fib(i): if i==1: return 0 elif i==2: return 1 else: return fib(i-1)+fib(i-2) >>> for i in range(1,11): print fib(i),
comobuscabinriaqueusadoparapesquisarumvalorem umalistaordenada
Chamemosdeimineimaxosndicesmnimoemximoda
Ento,ouovalorigualalista[imin]ounoestnalista Seno,podemosdividirointervalodebuscaemdois
Recurso infinita
Assimcomonoscasosdoslaosderepetio,precisocuidado
paranoescreverfunesinfinitamenterecursivas
Ex.:
def recursiva(x): if f(x): return True else: return recursiva(x)
Umafunorecursivatemque
usadoparaguardaropontoderetorno,osargumentose variveislocais
Assim,soluesiterativassonormalmentemais
eficientesdoquesoluesrecursivasequivalentes
Istonoquerdizerquesoluesiterativassempresejam
preferveisasoluesrecursivas
Seoproblemarecursivopornatureza,umasoluo
recursivamaisclara,maisfcildeprogramare, freqentemente,maiseficiente
Pensando recursivamente
Aoinvsdepensarconstrutivamenteparaparaobteruma
soluo,svezesmaissimplespensaremtermosde umaprovaindutiva
Considereoproblemadetestarseumalistaauma
permutaodalistab
Casobsico:aumalistavazia
Casobsico:a[0]noapareceemb
Casogenrico:a[0]apareceembnaposioi
quesuaprpriadefiniorecursiva
Porexemplo,umalistapodeserdefinidarecursivamente:
Umaoutradefinioquepodeserusadaparaanalisarlistas:
SeLumalista,ento:
L==[],ouseja,Lumalistavazia,ou
x=L.pop()tornaLumalistasemseultimoelementox EstadefinionototilemPythonjqueocomando
Exemplo: Subseqncia
def e_subseq(a,b): """ Retorna True sse a subseqncia de b, isto , se todos os elementos a[0..n-1] de a aparecem em b[j(0)], b[j(1)]... b[j(n-1)] onde j(i)<j(i+1) """ if a == []: # Lista vazia subseqncia de qq lista return True if a[0] not in b: return False return e_subseq (a[1:], b[b.index(a[0])+1:])
Encontrando a recorrncia
Algunsproblemasnoseapresentamnaturalmentecomo
recursivos,maspensarrecursivamenteprovasoluo
Tomeoproblemadecomputartodasaspermutaesde
umalista
Assumamosquesabemoscomputartodasaspermutaes deumalistasemseuprimeiroelementox
Torres de Hani
Jogoqueumexemploclssico
deproblemarecursivo
Consistedeumtabuleirocom3
pinosnoqualsoencaixados discosdetamanhodecrescente
Aidiamoverosdiscosdeum
pinoparaoutrosendoque:
capazdemovertodososdiscosmenosumdopinode origemparaopinosobressalente
Oalgoritmocompletoparamoverndiscosdopinode
origemAparaopinodedestinoBusandoopino sobressalenteC
Sen1,entoasoluotrivial Casocontrrio,
funomoverparaqueelanosdumarepresentao grficadomovimentodosdiscos