Professional Documents
Culture Documents
Programao Estruturada II
Tema 2: Recursividade
Relembrando ...
Funo
Solu!o adotada para dividir um pro"rama em m#dulos. Cada m#dulo deve e$ecutar uma a!o %em espec&fica. 's m#dulos podem ser reutili(ados )uantas ve(es forem necess*rios. Todo pro"rama escrito em C possui+ o%ri"atoriamente+ uma fun!o+ a main. 'utras fun es criadas pelo pro"ramador podem ser escritas antes ou depois da main.
25/02/2014
$i#os de %un&es
:!o rece%em par;metros e n!o retornam valor
25/02/2014
$i#os de %un&es
:!o rece%em par;metros e retornam valor
Fun&es iterativas
<tera!o si"nifica repeti!o. =un es iterativas reali(am um procedimento repetitivo para "erar um resultado. Cada itera!o 0ou cada repeti!o1 resolve um pedao do pro%lema. >uando a repeti!o terminar+ o pro%lema est* resolvido.
25/02/2014
O *ue + Recursividade,
Al"uma coisa )ue C definida em termos dela pr#pria. D a possi%ilidade de representar um pro%lema em fun!o dele pr#prio+ contudo+ numa inst;ncia menor. 4iminuir o pro%lema atC c.e"ar em uma solu!o trivial 0#%via ou de f*cil c*lculo1.
25/02/2014
E)em#lo de Recursividade
') -.lculo da #ot/ncia de um n0mero1
2E C %em mais f*cil de calcular )ue 2FGH. Entretanto+ o pro%lema C o mesmo+ o )ue muda C a inst;ncia do pro%lema 0ou o taman.o do pro%lema1.
E)em#lo de Recursividade
2E 8 2 B 2? 2? 8 2 B 22 22 8 2 B 2@
2@ 8 2
E)em#lo de Recursividade
) -.lculo do %atorial de um n0mero1
EI C %em mais f*cil de calcular )ue ?EJI Entretanto+ o pro%lema C o mesmo+ o )ue muda C a inst;ncia do pro%lema 0ou o taman.o do pro%lema1.
25/02/2014
E)em#lo de Recursividade
JI 8 J B EI EI 8 E B ?I ?I 8 ? B 2I
2I 8 2 B @I @I 8 @
#ara
25/02/2014
Funo recursiva da #ot/ncia em ,include-stdio../ int3#otencia(int3b(3int3e)! intKmain01K2 intK%ase+Ke$p+Kresult; printf03Mn4i"iteKvalorKdaK%ase:K31; scanf035d6+K7%ase1; printf03Mn4i"iteKvalorKdoKe$poente:K31; scanf035d6+K7e$p1; resultK8Kpotencia0%ase+Ke$p1; printf03MnPotenciaK8K5d3+Kresult1; "etc.ar01; 9
25/02/2014
Funo recursiva do %atorial em ,include-stdio../ int3%atorial(int3n)! intKmain01K2 intKnum+Kfat; printf03Mn4i"iteKvalorKdoKnPmero:K31; scanf035d6+K7num1; fatK8Kfatorial0num1; printf03Mn=atorialK8K5d3+Kfat1; "etc.ar01; 9
25/02/2014
4#licao de Recursividade
Problema '1
Resolvendo o #roblema 5
O =un!o de recorrLncia: fi%0pos1K8Kfi%0posO@1KAKfi%0posO21
- Instncia com soluo conhecida: fib(1) = 0 fib(2) = 1 - Condio de parada: pos = 1 ou pos = 2
25/02/2014
,include -stdio../ int %ibonacci(int #os)! int main0void1 2 int posicao+ num; printf034i"ite a posicao do nS deseTado:61; scanf035d6+ 7posicao1; num 8 fi%onacci0posicao1; println03:umero 8 5d6+ num1; "etc.ar01; 9
+
0 fib(1)
fib(2) 1
fib(1)
fib(0)
10
25/02/2014
4#licao de Recursividade
Problema 1
4esco%rir se um nPmero est* cadastrado em um vetor ordenado. Se o nPmero for encontrado+ mostrar sua posi!o dentro do vetor.
2 5 8 10 28 35
0
2
1
5
2
8
3
10
4
28
5
35
meio
0
2
1
5
3
10
4
28
5
35
11
25/02/2014
,includeK-stdio../
int3busca(int3vet67(3int3el(3int3i(3int3%)!
intKmain01K2 intKn+Kp+KvetVW822+KJ+KF+K@N+K2F+K?J9; printf0X4i"iteKoKnumeroKaKserKpes)uisadoK:KX1; scanf035d6+K7n1; pK8K%uscaK0vet+Kn+KN+KJ1; ifK0pK88KO@1 printf03:umeroKnaoKest*KnoKvetor.61; elseKprintf0X:umeroKest*KnaKposicaoK5d6+Kp1; "etc.01; 9
int3busca(int3vet67(3int3el(3int3i(3int3%)3{ intKmeio+Kpos; ifK0iK/Kf1 posK8KO@; elseK 2KmeioK8K0iKAKf1KYK2; ifK0elK88KvetVmeioW1 posK8Kmeio; elseKifK0elK-KvetVmeioW1 pos8%usca0vet+Kel+Ki+KmeioO@1; elseKpos8%usca0vet+Kel+KmeioA@+Kf1; 9K returnKpos;9
12
25/02/2014
Funo iterativa da #ot/ncia em ,include-stdio../ int3#otencia(int3b(3int3e)! intKmain01K2 intK%ase+Ke$p+Kresult; printf03Mn4i"iteKvalorKdaK%ase:K31; scanf035d6+K7%ase1; printf03Mn4i"iteKvalorKdoKe$poente:K31; scanf035d6+K7e$p1; resultK8Kpotencia0%ase+Ke$p1; printf03MnPotenciaK8K5d3+Kresult1; "etc.ar01; 9
13
25/02/2014
Funo iterativa do %atorial em ,include-stdio../ int3%atorial(int3n)! intKmain01K2 intKnum+Kfat; printf03Mn4i"iteKvalorKdoKnPmero:K31; scanf035d6+K7num1; fatK8Kfatorial0num1; printf03Mn=atorialK8K5d3+Kfat1; "etc.ar01; 9
do
%atorial
em
14
25/02/2014
int3busca(int3vet67(3int3el(3int3i(3int3%)!
intKmain01K2 intKn+Kp+KvetVW822+KJ+KF+K@N+K2F+K?J9; printf0X4i"iteKoKnumeroKaKserKpes)uisadoK:KX1; scanf035d6+K7n1; pK8K%uscaK0vet+Kn+KN+KJ1; ifK0pK88KO@1 printf03:umeroKnaoKest*KnoKvetor.61; elseKprintf0X:umeroKest*KnaKposicaoK5d6+Kp1; "etc.01;K9
-onclus&es
RecursividadeKpodeKserKusadaKemKsitua esK espec&ficas; =un esKrecursivasKconsomemKmaisKmem#ria; =un esKrecursivasKpodemKrepresentarKsolu esK maisKele"antesKeKmaisKsimplesKemKal"unsKcasosK 0e$:Kmanipula!oKdeK*rvores1.
15