Beruflich Dokumente
Kultur Dokumente
Recursividade(cinciadacomputao)
Origem:Wikipdia,aenciclopdialivre.
Emcinciadacomputao,arecursividadeadefiniodeumasubrotina(funooumtodo)quepode
invocarasimesma.Umexemplodeaplicaodarecursividadepodeserencontradonosanalisadoressintticos
recursivosparalinguagensdeprogramao.Agrandevantagemdarecursoestnapossibilidadedeusarum
programadecomputadorfinitoparadefinir,analisarouproduzirumestoquepotencialmenteinfinitode
sentenas,designsououtrosdados.
ndice
1 Algoritmosrecursivos
2 Programaorecursiva
2.1 RecursoversusIterao
3 Funesrecursivas
4 Funesrecursivasemcauda
5 RecursoIndireta
6 RecursoAninhada
7 Ordemdechamadadefunes
7.1 Funo1
7.2 Funo2comlinhastrocadas
8 Funoqueretornaasomadosnmerosdenat0
9 DivisodenmeroscomRecurso
10 Usandovetores
11 Vertambm
12 Ligaesexternas
Algoritmosrecursivos
Ummtodocomumdesimplificaoconsisteemdividirumproblemaemsubproblemasdomesmotipo.Como
tcnicadeprogramao,istosedenominadivisoeconquista,econstituiachaveparaodesenvolvimentode
muitosalgoritmosimportantes,bemcomoumelementofundamentaldoparadigmadeprogramaodinmica.
Praticamentetodasaslinguagensdeprogramaousadashojeemdiapermitemaespecificaodiretade
funeseprocedimentosrecursivos.Quandoumafunoinvocada,ocomputador(namaioriadaslinguagens
sobreamaiorpartedasarquiteturasbaseadasempilhas)ouaimplementaodalinguagemregistraasvrias
instnciasdeumafuno(emmuitasarquiteturas,usaseumapilhadechamada,emboraoutrosmtodos
possamserusados).Reciprocamente,todafunorecursivapodesertransformadaemumafunoiterativa
usandoumapilha.
Todafunoquepuderserproduzidaporumcomputadorpodeserescritacomofunorecursivasemousode
iteraoreciprocamente,qualquerfunorecursivapodeserdescritaatravsdeiteraessucessivas.
Umexemplosimplespoderiaseroseguinte:seumapalavradesconhecidavistaemumlivro,oleitorpode
tomarnotadonmerodapginaecolocaremumapilha(queatentoestvazia).Oleitorpodeconsultaresta
novapalavrae,enquantolotexto,podeacharmaispalavrasdesconhecidaseacrescentarnotopodapilha.O
nmerodapginaemqueestaspalavrasocorremtambmsocolocadosnotopodapilha.Emalgummomento
dotexto,oleitorvaiacharumafraseouumpargrafoondeestaltimapalavraanotadaepelocontextoda
https://pt.wikipedia.org/wiki/Recursividade_(ci%C3%AAncia_da_computa%C3%A7%C3%A3o) 1/6
01/03/2017 Recursividade(cinciadacomputao)Wikipdia,aenciclopdialivre
frasevaidescobriroseusignificado.Entooleitorvoltaparaapginaanteriorecontinualendodali.
Paulatinamente,removeseseqencialmentecadaanotaoqueestnotopodapilha.Finalmente,oleitorvolta
paraasualeiturajsabendoosignificadoda(s)palavra(s)desconhecida(s).Istoumaformaderecurso.
Algumaslinguagensdesenvolvidasparaprogramaolgicaeprogramaofuncionalpermitemrecurses
comonicaestruturaderepetio,ouseja,nopodemusarlaostaiscomoosproduzidosporcomandoscomo
for,whileourepeat.Taislinguagensgeralmentefazemumarecursoemcaudatoeficientequantoaiterao,
deixandoosprogramadoresexprimiremoutrasestruturasderepetio(taiscomoomapeofordoScheme)em
termosderecurso.
ArecursoestprofundamenteentranhadanaTeoriadacomputao,umavezqueaequivalnciatericaentre
asfunes recursivaseasmquinasdeTuringestnabasedasidiassobreauniversalidadedocomputador
moderno.
Programaorecursiva
Emgeral,umadefiniorecursivadefinidaporcasos:umnmerolimitadodecasosbaseeumcasorecursivo.
Oscasosbasesogeralmentesituaestriviaisenoenvolvemrecurso.
UmexemplocomumusandorecursoafunoparacalcularofatorialdeumnaturalN.Nessecaso,nocaso
baseovalorde0!1.Nocasorecursivo,dadoumN>0,ovalordeN!calculadomultiplicandoporNovalor
de(N1)!,eassimpordiante,detalformaqueN!temcomovalorN*(N1)*(N2)*...*(NN)!,onde(NN)!
representaobviamenteocasobase.Emtermosrecursivos:
funofatorial(x:inteiro):inteiro
inicio
sex=0ento
fatorial<1
seno
fatorial<x*fatorial(x1)
fim_se
fim
Aquiestamesmafunocodificadasemrecurso.importantemencionarqueestasoluoiterativarequer
duasvariveistemporriasemgeral,formulaesrecursivasdealgoritmossofreqentementeconsideradas
"maisenxutas"ou"maiselegantes"doqueformulaesiterativas.
funofatorial(x:inteiro):inteiro
vari,aux:inteiro
inicio
aux<1
paraide1atxfaa
aux<aux*i
fim_para
fatorial<aux
fim
RecursoversusIterao
Noexemplodofatorial,aimplementaoiterativatendeaserligeiramentemaisrpidanaprticadoquea
implementaorecursiva,umavezqueumaimplementaorecursivaprecisaregistraroestadoatualdo
processamentodemaneiraqueelapossacontinuardeondeparouapsaconclusodecadanovaexecuo
subordinadadoprocedimentorecursivo.Estaaoconsometempoememria.(Notequeaimplementaode
umafunofatorialparanmerosnaturaispequenosmaisrpidaquandoseusaumatabeladebusca.)
Existemoutrostiposdeproblemascujassoluessoinerentementerecursivas,jqueelasprecisammanter
registrosdeestadosanteriores.Umexemploopercursodeumarvoreoutrosexemplosincluemafunode
Ackermannealgoritmosdedivisoeconquista,taiscomooQuicksort.Todosestesalgoritmospodemser
https://pt.wikipedia.org/wiki/Recursividade_(ci%C3%AAncia_da_computa%C3%A7%C3%A3o) 2/6
01/03/2017 Recursividade(cinciadacomputao)Wikipdia,aenciclopdialivre
implementadositerativamentecomaajudadeumapilha,masousodeumapilha,decertaforma,anulaas
vantagensdassoluesiterativas.
Outrapossvelmotivaoparaseescolherumalgoritmoiterativoaoinvsdeumalgoritmorecursivoquenas
linguagensdeprogramaomodernasoespaodisponvelparaofluxodecontrolegeralmentebemmenor
queoespaodisponvelnoheap,ealgoritmosrecursivostendemanecessitardemaisespaonapilhadoque
algoritmositerativos.
Funesrecursivas
Funescujosdomniospodemserdefinidosrecursivamente(talcomoodomniodosnmerosnaturais)
possuemfrequentementedefiniesrecursivasqueseguemadefiniorecursivadodomnio(nocasodos
naturais,definimosocomportamentodafunocomentrada0,eparacadaentradapositiva
definimosocomportamentodafunorecursivaapartirdeseucomportamentocomentrada ).
Oexemploclssicodeumafunodefinidarecursivamenteaseguintedefiniodafuno :
Apartirdestadefinio,tambmchamadarelaoderecorrncia,calculamos daseguinteforma:
Funesrecursivasemcauda
Asfunesrecursivasemcaudaformamumasubclassedasfunesrecursivas,nasquaisachamadarecursiva
altimainstruoaserexecutada.Porexemplo,afunoaseguir,paralocalizarumvaloremumalistaligada
recursivaemcauda,porquealtimacoisaqueelafazinvocarasimesma:
registronoh
dado:inteiro
*proximo:registronoh
fim_registro
*acha_valor(*cabeca:registronoh,valor:inteiro):registronoh
inicio
secabeca=NULOento
acha_valor<NULO
senosecabea.dado=valorento
acha_valor<cabeca
seno
acha_valor<acha_valor(cabeca.proximo,valor)
fim_se
fim
Notequeafunofatorialusadacomoexemplonaseoanteriornorecursivaemcauda,poisdepoisque
elarecebeoresultadodachamadarecursiva,eladevemultiplicaroresultadoporxantesderetornarparao
pontoemqueocorreachamada.Funescomestetipodecomportamentosoporvezesdenominadas
https://pt.wikipedia.org/wiki/Recursividade_(ci%C3%AAncia_da_computa%C3%A7%C3%A3o) 3/6
01/03/2017 Recursividade(cinciadacomputao)Wikipdia,aenciclopdialivre
crescentementerecursivas.
importanterecordarqueumanicafunopodeterambososcomportamentos,comoocorrenaseguinte
funoquecontaosinteirosmparesemumalistaligada:
funoconta_impares(*cabeca:registronoh):inteiro
inicio
secabeca=NULOento
conta_impares<0
senose(cabeca>dadoMOD2)=1ento
conta_impares<conta_impares(cabeca>proximo)+1/*recurso*/
seno
conta_impares<conta_impares(cabeca>proximo)/*recursoemcauda*/
fim
Umbomcompiladorpodetraduzircdigorecursivoemcaudaparacdigoiterativo.Comtalcompilador,h
vantagememusarrecursoemcaudaparaalgumasfunes.Definiesrecursivasalgumasvezessomuito
maisclarasdoqueasiterativas.Contudo,chamadasrecursivassomaiscustosasdoqueiteraes.Com
recursoemcaudapodemostercdigorecursivolegveleumaimplementaoiterativaeficienteaomesmo
tempo.
Omaisimportantenarecursoemcaudaqueaofazerumachamadadafunorecursiva,osvaloresde
retornodelanonecessitamserconservadosnapilhadechamadaquandoachamadarecursivaretorna,elavai
diretamenteparaaposioderetornopreviamenteregistrada.Assim,oscompiladoresquedosuporte
recursoemcaudaeconomizamespaoetempo.
RecursoIndireta
Funespodemserrecursivas(invocarasiprprias)indiretamente,fazendoistoatravsdeoutrasfunes:
assim,"P"podechamar"Q"quechama"R"eassimpordiante,atque"P"sejanovamenteinvocada.
Umexemploaanlisedeexpresses.Suponhaquevoctemumanalisadorsintticoparacadatipodesub
expresso,etenhaumaexpresso"3+(2*(4+4))".Afunoqueprocessaexpresses"+"chamariauma
segundafunoqueprocessariaexpresses"*",que,porsuavez,chamarianovamenteaprimeira.
RecursoAninhada
Umachamadarecursivapodereceberumargumentoqueincluiumaoutrachamadarecursiva.Umexemploa
funodeAckermann,umafunoquecrescedeformaincrivelmenterpida.
funoack(n:inteiro,m:inteiro):inteiro
inicio
sen=0ento
ack<m+1
senosen>0Em=0ento
ack<ack(n1,m)
seno
ack<ack(n1,ack(n,m1))
fim_se
fim
Esteumexemplodeumafunoquemuitomaisfcildeescreverrecursivamente:foidemonstradoqueno
existemdefiniesequivalentesusandooperadoresaritmticos.Infelizmenteumacomputaorecursivadireta
destafunononemmesmoO(2n)emtempoouespao.
Arecursoaninhadaumtipoespecialderecursodupla,ondeumadefiniorecursivarefereseasiprpria
maisdeumavez.
https://pt.wikipedia.org/wiki/Recursividade_(ci%C3%AAncia_da_computa%C3%A7%C3%A3o) 4/6
01/03/2017 Recursividade(cinciadacomputao)Wikipdia,aenciclopdialivre
Ordemdechamadadefunes
Aordemdachamadadasfunespodemmudarcompletamenteaexecuodafuno,vejaoexemploemC:
Funo1
voidrecursiveFunction(intnum)
{
if(num<5)
{
printf("%d\n",num);
recursiveFunction(num+1);
}
}
Funo2comlinhastrocadas
voidrecursiveFunction(intnum)
{
if(num<5)
{
recursiveFunction(num+1);
printf("%d\n",num);
}
}
Funoqueretornaasomadosnmerosdenat0
intsoma(intn)
{
if(n>0)
returnn+soma(n1);
else
return0;
}
DivisodenmeroscomRecurso
Funoparadividirnmerosutilizandosomentesomaesubtrao:
https://pt.wikipedia.org/wiki/Recursividade_(ci%C3%AAncia_da_computa%C3%A7%C3%A3o) 5/6
01/03/2017 Recursividade(cinciadacomputao)Wikipdia,aenciclopdialivre
FunodivisaoRec(inteironum,inteiroden)retornaInteiro
Inicio
Se(num<den)
Ento
Funo_Retorna(0)
Seno
Funo_Retorna(divisaoRec(numden,den)+1)
Fim_Se
Fim
Usandovetores
Funesrecursivastambmpodemserusadasparaacessarelementosdevetores,noexemploabaixo
mostradoumafunorecursivaqueretornaasomadoselementosdeumvetor.
intsomatoria(intvetor[],inttamanho)
{
if(tamanho>0)
returnvetor[tamanho1]+somatoria(vetor,tamanho1);
else
return0;
}
Vertambm
Recursividade
Ligaesexternas
IntroduoaCinciadaComputaoSchemePUC/RIO(http://webmasters.tol.pro.br/portal/index.ph
p?option=com_remository&Itemid=32&func=fileinfo&parent=category&filecatid=443)
RecursoUFLALavras/MG(http://www.dcc.ufla.br/~bruno/aulas/lp2/recursao.html)
FunesRecursivasUNICAMP(http://www.dca.fee.unicamp.br/courses/EA072/lisp9596/node17.html)
FundodaComputaoRecursodefinioetiposmaisutilizados(http://www2.fundao.pro.br/article
s.asp?cod=33)
Obtidade"https://pt.wikipedia.org/w/index.php?
title=Recursividade_(cincia_da_computao)&oldid=48096811"
Estapginafoimodificadapelaltimavez(s)22h29minde23defevereirode2017.
EstetextodisponibilizadonostermosdalicenaCreativeCommonsAtribuioCompartilhaIgual
3.0NoAdaptada(CCBYSA3.0)podeestarsujeitoacondiesadicionais.Paramaisdetalhes,
consulteascondiesdeuso.
https://pt.wikipedia.org/wiki/Recursividade_(ci%C3%AAncia_da_computa%C3%A7%C3%A3o) 6/6