Você está na página 1de 6

01/03/2017 Recursividade(cinciadacomputao)Wikipdia,aenciclopdialivre

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"

Categorias: Estruturasdecontrole Lgica

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