Você está na página 1de 24
RecursividadeRecursividade nana LinguagemLinguagem CC
RecursividadeRecursividade nana
LinguagemLinguagem CC
FunFunççãoão RecursivaRecursiva FunFunççãoão recursivarecursiva éé aquelaaquela queque chamachama aa sisi
FunFunççãoão RecursivaRecursiva
FunFunççãoão recursivarecursiva éé aquelaaquela queque chamachama aa sisi
prpróópria.pria. UmaUma funfunççãoão poderpoderáá tambtambéémm serser
consideradaconsiderada recursivarecursiva sese chamarchamar outrasoutras funfunççõesões
que,que, emem algumalgum momento,momento, chamemchamem aa primeiraprimeira
funfunçção,ão, tornandotornando esseesse conjuntoconjunto dede funfunççõesões umum
processoprocesso recursivo.recursivo.
AsAs funfunççõesões recursivasrecursivas sãosão emem suasua maioriamaioria solusoluççõesões maismais
AsAs funfunççõesões recursivasrecursivas sãosão emem suasua maioriamaioria
solusoluççõesões maismais eleganteselegantes ee simples,simples, sese
comparadascomparadas aa funfunççõesões tradicionaistradicionais ouou iterativas,iterativas,
jjáá queque executamexecutam tarefastarefas repetitivasrepetitivas semsem utilizarutilizar
nenhumanenhuma estruturaestrutura dede repetirepetiçção,ão, comocomo forfor ouou
whilewhile
PorPoréémm essaessa elegânciaelegância ee simplicidadesimplicidade
têmtêm umum prepreççoo queque requerrequer muitamuita atenatenççãoão emem suasua
implementaimplementaçção.ão.
TrazendoTrazendo aa recursividaderecursividade parapara oo nossonosso cotidianocotidiano umum óótimotimo exemploexemplo
TrazendoTrazendo aa recursividaderecursividade parapara oo nossonosso cotidianocotidiano
umum óótimotimo exemploexemplo estestáá nana aaççãoão dede contarcontar umum
sacosaco dede moedas,moedas, ondeonde aa cadacada atoato dede retirarretirar umauma
moedamoeda dodo sacosaco precisaprecisa--sese ““contarcontar dinheirodinheiro”” queque
correspondecorresponde aa identificaridentificar qualqual éé oo valorvalor dada
moedamoeda ee somsomáá--lala àà quantiaquantia queque aindaainda estestáá nono
saco.saco.
ParaPara identificaridentificar aa quantiaquantia queque aindaainda estestáá nono sacosaco bastabasta chamarchamar aa
ParaPara identificaridentificar aa quantiaquantia queque aindaainda estestáá nono
sacosaco bastabasta chamarchamar aa mesmamesma funfunççãoão ““contarcontar
dinheirodinheiro”” novamente,novamente, porporéémm dessadessa vezvez jjáá
considerandoconsiderando queque essaessa moedamoeda nãonão estestáá maismais lláá
EE esteeste processoprocesso dede retirarretirar umauma moeda,moeda,
identificaridentificar seuseu valorvalor ee somarsomar comcom oo restanterestante dodo
sacosaco sese repeterepete atatéé queque oo sacosaco estejaesteja vazio,vazio,
quandoquando atingiremosatingiremos oo pontoponto dede paradaparada ee aa
funfunççãoão retornarretornaráá oo valorvalor zero,zero, indicandoindicando queque
nãonão hháá maismais moedasmoedas nono saco.saco.
NesseNesse pontoponto aa funfunççãoão ““contarcontar dinheirodinheiro”” foifoi chamadachamada umum
NesseNesse pontoponto aa funfunççãoão ““contarcontar dinheirodinheiro”” foifoi
chamadachamada umum nnúúmeromero dede vezesvezes igualigual aa
quantidadequantidade dede moedasmoedas nono saco,saco, ee aa úúltimaltima
chamadachamada comecomeççaa aa devolverdevolver osos valoresvalores dede
retornoretorno dede cadacada instânciainstância dada funfunçção,ão, iniciandoiniciando
porpor zerozero (saco(saco vazio),vazio), somadosomado aoao valorvalor dada
úúltimaltima moeda,moeda, dada penpenúúltima,ltima, etc,etc, atatéé retornarretornar àà
primeiraprimeira chamadachamada referentereferente aa primeiraprimeira moeda,moeda,
ee nessenesse momentomomento aa funfunççãoão inicialinicial sese encerraencerra
trazendotrazendo comocomo valorvalor dede retornoretorno aa somasoma dosdos
valoresvalores dede todastodas asas moedasmoedas queque estavamestavam nono
saco.saco.
UmaUma funfunççãoão podepode chamarchamar aa sisi prpróópriapria porpor umum nnúúmeromero limitadolimitado dede
UmaUma funfunççãoão podepode chamarchamar aa sisi prpróópriapria porpor umum
nnúúmeromero limitadolimitado dede vezes.vezes. EsseEsse limitelimite éé dadodado
pelopelo tamanhotamanho dada pilhapilha (que(que poderpoderáá serser melhormelhor
compreendidocompreendido apapóóss aa apresentaapresentaççãoão dodo trabalhotrabalho
dodo grupogrupo B).B). SeSe oo valorvalor correspondentecorrespondente aoao
tamanhotamanho mmááximoximo dada pilhapilha forfor atingido,atingido, haverhaveráá
umum estouroestouro dada pilhapilha ouou ““StackStack OverflowOverflow””
NãoNão
conseguimosconseguimos resultadosresultados muitomuito conclusivosconclusivos nana
avaliaavaliaççãoão dessedesse estouroestouro dede pilhapilha nosnos testestestes
realizados,realizados, porporéémm deudeu prapra perceberperceber numnum
programaprograma parapara gerargerar umauma seqseqüüênciaência dede
FibonacciFibonacci comcom valoresvalores grandes,grandes, queque oo programaprograma
estavaestava usandousando acimaacima dede 90%90% dosdos recursosrecursos dada
CPU,CPU, oo queque demonstrademonstra comocomo éé pesadopesado parapara oo
computadorcomputador realizarrealizar umauma tarefatarefa recursiva.recursiva.
CadaCada vezvez queque umauma funfunççãoão éé chamadachamada dede formaforma recursiva,recursiva, sãosão
CadaCada vezvez queque umauma funfunççãoão éé chamadachamada dede formaforma
recursiva,recursiva, sãosão alojadosalojados ee armazenadosarmazenados umauma
ccóópiapia dosdos seusseus parâmetros,parâmetros, dede modomodo aa nãonão
perderperder osos valoresvalores dosdos parâmetrosparâmetros dasdas chamadaschamadas
anteriores.anteriores. EmEm cadacada instânciainstância dada funfunçção,ão, ssóó sãosão
diretamentediretamente acessacessííveisveis osos parâmetrosparâmetros criadoscriados
parapara estaesta instância,instância, nãonão sendosendo posspossíívelvel acessaracessar
osos parâmetrosparâmetros dasdas outrasoutras instâncias.instâncias.
AA informainformaççãoão armazenadaarmazenada nana chamadachamada dede umauma funfunççãoão éé designadadesignada
AA informainformaççãoão armazenadaarmazenada nana chamadachamada dede umauma
funfunççãoão éé designadadesignada porpor estruturaestrutura dede invocainvocaççãoão
ouou registroregistro dede ativaativaççãoão ee consisteconsiste basicamentebasicamente
nana seguinteseguinte informainformaçção:ão:
•• EndereEndereççoo dede retornoretorno (quando(quando aa funfunççãoão terminarterminar oo programaprograma
•• EndereEndereççoo dede retornoretorno (quando(quando aa funfunççãoão
terminarterminar oo programaprograma devedeve continuarcontinuar aa suasua
execuexecuççãoão nana linhalinha seguinteseguinte àà invocainvocaççãoão dada
funfunçção)ão)
•• EstadoEstado dosdos registrosregistros ee flagsflags dada CPUCPU
•• VariVariááveisveis passadaspassadas comocomo argumentosargumentos parapara aa
funfunççãoão (por(por valor,valor, referência,referência, etc.)etc.)
•• VariVariáávelvel dede retornoretorno (por(por valor,valor, referência,referência,
etc.)etc.)
AA chamadachamada aa umauma funfunççãoão recursivarecursiva éé igualigual àà chamadachamada dede umauma
AA chamadachamada aa umauma funfunççãoão recursivarecursiva éé igualigual àà
chamadachamada dede umauma funfunççãoão nãonão recursiva,recursiva, nana qualqual
éé necessnecessááriorio guardarguardar umauma ““estruturaestrutura dede
invocainvocaççãoão””,, sendosendo estaesta estruturaestrutura liberadaliberada depoisdepois
dodo fimfim dada execuexecuççãoão dada funfunççãoão ee atualizaatualizaççãoão dodo
valorvalor dede retorno.retorno.
FunFunççõesões recursivasrecursivas contemcontem duasduas partespartes fundamentais:fundamentais: PontoPonto dede
FunFunççõesões recursivasrecursivas contemcontem duasduas
partespartes fundamentais:fundamentais:
PontoPonto dede ParadaParada ouou CondiCondiççãoão dede ParadaParada::
queque éé oo pontoponto ondeonde aa funfunççãoão serseráá encerrada,encerrada,
ee éé geralmentegeralmente umum limitelimite superiorsuperior ouou inferiorinferior
dada regraregra geral.geral.
RegraRegra GeralGeral:: éé oo mméétodotodo queque reduzreduz aa
resoluresoluççãoão dodo problemaproblema atravatravééss dada invocainvocaççãoão
recursivarecursiva dede casoscasos menores,menores, queque porpor suasua vezvez
sãosão resolvidosresolvidos pelapela resoluresoluççãoão dede casoscasos aindaainda
menoresmenores pelapela prpróópriapria funfunçção,ão, assimassim
sucessivamentesucessivamente atatéé atingiratingir oo ““pontoponto dede
paradaparada”” queque finalizafinaliza oo mméétodo.todo.
ParaPara sese criarcriar umum algoritmoalgoritmo recursivo,recursivo, devedeve--sese primeiroprimeiro procurarprocurar
ParaPara sese criarcriar umum algoritmoalgoritmo recursivo,recursivo, devedeve--sese
primeiroprimeiro procurarprocurar encontrarencontrar umauma solusoluççãoão dede
comocomo oo problemaproblema podepode serser divididodividido emem passospassos
menores.menores. DepoisDepois definirdefinir umum pontoponto dede parada.parada.
EmEm seguida,seguida, definirdefinir umauma regraregra geralgeral queque sejaseja
vváálidalida parapara todostodos osos demaisdemais casos.casos. DeveDeve--sese
verificarverificar sese oo algoritmoalgoritmo termina,termina, ouou seja,seja, sese oo
pontoponto dede paradaparada éé atingido.atingido. ParaPara auxiliarauxiliar nessanessa
verificaverificaçção,ão, recomendarecomenda--sese criarcriar umauma áárvorervore dede
execuexecuççãoão dodo programa,programa, comocomo umum chinês,chinês,
mostrandomostrando oo desenvolvimentodesenvolvimento dodo processo.processo.
TodoTodo processoprocesso recursivorecursivo requerrequer recursosrecursos dada mmááquina,quina, tantotanto dede
TodoTodo processoprocesso recursivorecursivo requerrequer recursosrecursos dada
mmááquina,quina, tantotanto dede tempotempo quandoquando dede espaespaççoo dede
memmemóória.ria. UmaUma medidamedida nãonão muitomuito precisaprecisa
dessesdesses recursos,recursos, masmas suficientementesuficientemente úútil,til,
baseiabaseia--sese nana ““ordemordem dede crescimentocrescimento””,, elaela nosnos
permitepermite caracterizar,caracterizar, dede formaforma aproximada,aproximada, oo
consumoconsumo dede recursosrecursos emem funfunççãoão dada dimensãodimensão
dodo problema.problema.
DeveDeve--sese utilizarutilizar aa recursividaderecursividade quandoquando estaesta formaforma forfor aa maismais
DeveDeve--sese utilizarutilizar aa recursividaderecursividade quandoquando estaesta
formaforma forfor aa maismais simplessimples ee intuitivaintuitiva dede
implementarimplementar umauma solusoluççãoão parapara aa resoluresoluççãoão dede
umum determinadodeterminado problema.problema. SeSe nãonão forfor (simples(simples
ee intuitiva),intuitiva), serseráá entãoentão melhormelhor empregarempregar outrosoutros
mméétodostodos nãonão recursivos,recursivos, tambtambéémm chamadoschamados dede
““mméétodostodos iterativositerativos””
AplicaAplicaççõesões prprááticasticas dede funfunççõesões recursivasrecursivas nana linguagemlinguagem CC
AplicaAplicaççõesões prprááticasticas dede funfunççõesões
recursivasrecursivas nana linguagemlinguagem CC
ComoComo primeiroprimeiro exemploexemplo dede funfunççãoão recursiva,recursiva,
vamosvamos verver oo ccáálculolculo dede fatorial.fatorial.
FatorialFatorial 11 -- //Recursividade//Recursividade nana LinguagemLinguagem CC 22 -- //PRC//PRC -- Prof.Prof.
FatorialFatorial
11
-- //Recursividade//Recursividade nana LinguagemLinguagem CC
22
-- //PRC//PRC -- Prof.Prof. JoãoJoão
33
-- //FATORIAL//FATORIAL
44
-- ##includeinclude ““stdiostdio.h.h””
55
-- intint fatorial(intfatorial(int x){x){
66
--
if((if(( xx ==== 00 )) |||| (( xx ==1))==1))
77
--
returnreturn 1;1;
88
--
elseelse
99
--
returnreturn(x(x ** fatorial(xfatorial(x--1));1));
1010
-- }}
1111
-- mainmain(){(){
1212
--
1313
--
intint num;num;
printfprintf("Entre("Entre comcom umum nnúúmero:mero: ");");
1414
--
scanfscanf("%d",("%d", &num);&num);
1515
--
printfprintf("O("O fatorialfatorial dede %d%d éé %d.",%d.", num,num, fatorial(num));fatorial(num));
1616
-- }}
ChinêsChinês FatorialFatorial 5! 120 5*4! 5*(24) 4*3! 4*(6) 3*2! 3*(2) 2*1! 2*(1) 1*0! 1*(1) 1
ChinêsChinês FatorialFatorial
5!
120
5*4!
5*(24)
4*3!
4*(6)
3*2!
3*(2)
2*1!
2*(1)
1*0!
1*(1)
1
1
FibonacciFibonacci 11 -- //Recursividade//Recursividade nana LinguagemLinguagem CC 22 -- //PRC//PRC -- Prof.Prof.
FibonacciFibonacci
11
-- //Recursividade//Recursividade nana LinguagemLinguagem CC
22
-- //PRC//PRC -- Prof.Prof. JoãoJoão
33
-- //FIBONACCI//FIBONACCI
44
-- ##includeinclude ““stdiostdio.h.h””
55
-- intint fibonaccifibonacci(int(int N)N) {{
66
--
if(if( NN ==== 11 ))
77
--
returnreturn 1;1;
88
--
elseelse
99
--
if(if( NN ==== 2)2)
1010
--
returnreturn 1;1;
1111
--
elseelse
1212
--
returnreturn((fibonaccifibonacci(N(N--1)1) ++ fibonaccifibonacci(N(N--2));2));
1313
-- }}
1414
-- mainmain()() {{
1515
--
intint num,num, F;F;
1616
--
printfprintf("Entre("Entre comcom umum nnúúmero:mero:
");");
1717
--
1818
--
scanfscanf("%d",("%d", &num);&num);
printfprintf("A("A sséérierie dede FibonacciFibonacci parapara %d%d elementoselementos éé::\\n",n", num);num);
1919
--
for(F=1;Ffor(F=1;F <=<= num;F++)num;F++) {{
2020
--
printfprintf("%d,("%d, ",", fibonaccifibonacci(F));}(F));}
2121
--
printfprintf("("\\nOknOk");");
2222
-- }}
ChinêsChinês FibonacciFibonacci 5 5-1 4 4-1 4-2 5-2 3 2 3 3-1 3-2 1 3-1
ChinêsChinês FibonacciFibonacci
5
5-1
4
4-1
4-2
5-2
3
2
3
3-1
3-2
1
3-1
3-2
2
1
2
1
1
1
SomatSomatóóriorio 11 -- //Recursividade//Recursividade nana LinguagemLinguagem CC 22 -- //PRC//PRC -- Prof.Prof.
SomatSomatóóriorio
11
-- //Recursividade//Recursividade nana LinguagemLinguagem CC
22
-- //PRC//PRC -- Prof.Prof. JoãoJoão
33
-- //SOMATORIO//SOMATORIO
44
-- ##includeinclude ““stdiostdio.h.h””
55
-- intint somatoriosomatorio(int(int x)x) {{
66
--
if(if( xx ==== 11 ))
77
--
returnreturn 1;1;
88
--
elseelse
99
--
returnreturn(x(x ++ somatoriosomatorio(x(x --1));1));
1010
-- }}
1111
-- mainmain()() {{
1212
--
intint num;num;
1313
--
1414
--
1515
--
printfprintf("Entre("Entre comcom umum nnúúmero:mero: ");");
scanfscanf("%d",("%d", &num);&num);
printfprintf("O("O somatsomatóóriorio dede 00 atatéé %d%d éé %d.",%d.", num,num, somatoriosomatorio(num));(num));
1616
-- }}
ChinêsChinês SomatSomatóóriorio 5 15 5+Somatorio(4-1) 5+10 5+4+Somatorio(3-1) 5+4+6 5+4+3+Somatorio(2-1)
ChinêsChinês SomatSomatóóriorio
5
15
5+Somatorio(4-1)
5+10
5+4+Somatorio(3-1)
5+4+6
5+4+3+Somatorio(2-1)
5+4+3+3
5+4+3+2+Somatorio(1-1)
5+4+3+2+1
5+4+3+2+1+Somatorio(0)
ContaConta DDíígitosgitos 11 -- //Recursividade//Recursividade nana LinguagemLinguagem CC 22 -- //PRC//PRC --
ContaConta DDíígitosgitos
11
-- //Recursividade//Recursividade nana LinguagemLinguagem CC
22
-- //PRC//PRC -- Prof.Prof. JoãoJoão
33
-- //CONTA//CONTA DIGITOSDIGITOS
44
-- ##includeinclude ““stdiostdio.h.h””
55
-- intint digitosdigitos(int(int x)x) {{
66
--
if(if( absabs(x)(x) << 1010 ))
77
--
returnreturn 1;1;
88
--
elseelse
99
--
returnreturn(1(1 ++ digitosdigitos(x/10));(x/10));
1010
-- }}
1111
-- mainmain()() {{
1212
--
1313
--
1414
--
intint num;num;
printfprintf("Entre("Entre comcom umum nnúúmero:mero: ");");
scanfscanf("%d",("%d", &num);&num);
1515
--
printfprintf("O("O nnúúmeromero dede ddíígitosgitos dede %d%d éé %d.",%d.", num,num, digitosdigitos(num));(num));
1616
-- }}
ChinêsChinês ContaConta DDíígitosgitos 123456 6 1+digito(12345/10) 1+5 1+1+digito(1234/10) 1+1+4
ChinêsChinês ContaConta DDíígitosgitos
123456
6
1+digito(12345/10)
1+5
1+1+digito(1234/10)
1+1+4
1+1+1+digito(123/10)
1+1+1+3
1+1+1+1+digito(12/10)
1+1+1+1+2
1+1+1+1+1+digito(1,2/10)
1+1+1+1+1+1
1+1+1+1+1+1+digito(0,12/10)