You are on page 1of 15

25/02/2014

Programao Estruturada II
Tema 2: Recursividade

Prof MSc. Edilene A. V. de Campos

Objetivos desse encontro


Entender o conceito de recursividade; Criar fun es recursivas; Comparar solu es recursivas e iterativas.

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

Funo escrita antes da main


,include -stdio../ int dobro(int n) { n=n* ! return n! " int main01 2 int a; res; printf034i"ite um valor: 31; scanf035d6+ 7a1; res 8 do%ro0a1; printf034o%ro de 5d 8 5d6+ a+ res1; "etc.ar01; 9

Funo escrita de#ois da main


,include -stdio../ int dobro(int n)! int main01 2 int a; res; printf034i"ite um valor: 31; scanf035d6+ 7a1; res 8 do%ro0a1; printf034o%ro de 5d 8 5d6+ a+ res1; "etc.ar01; 9 int dobro(int n) { n=n* ! return n! "

$i#os de %un&es
:!o rece%em par;metros e n!o retornam valor

void %uncao() { ... "


Rece%em par;metros e n!o retornam valor

void %uncao(#ar'( #ar ( ...) { ... "

25/02/2014

$i#os de %un&es
:!o rece%em par;metros e retornam valor

ti#o %uncao() { ... return )! "


Rece%em par;metros e retornam valor

ti#o %uncao(#ar'( #ar ( ...) { ... return )! "

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.

E)em#lo de %un&es iterativas


,include -stdio../ int #otencia(int b( int e)! int main0void1 2 int %ase+ e$p+ result; %ase 8 2; e$p 8 ?; result8calculo0%ase+ e$p1; "etc.ar01; 9

25/02/2014

int #otencia(int b( int e) { int i+ r 8 @; for 0i 8 @; i -8 e; iAA1 2 r 8 r B %; 9 return r; 9

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 @

-aracter2sticas im#ortantes %un&es recursivas

#ara

PossuemKumaKfun!oKdeKrecorrLncia; PossuemKumaKcondi!oK)ueKidentificaKoK momentoKdeKinterromperKaKrecorrLncia; PossuemKsempreKinst;nciaKdoKpro%lemaKparaK aK)ualKaKsolu!oKCKfacilmenteKo%tida.

Funo recursiva #ara calcular uma #ot/ncia


2E 8 2 B 2? 2? 8 2 B 22 22 8 2 B 2@
2@ 8 2 Suponto uma potncia genericamente representada por be: - Funo de recorrncia: be = b * be-1 - Instncia com soluo conhecida: b1 = b - Condio de parada: se e=1

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

Funo recursiva da #ot/ncia em (continuao)


int3#otencia(int3b(3int3e)3{ intKpotK8KN; ifK0eK88K@1K2 potK8K%; 9 elseK2 potK8K%KBKpotencia0%+KO@1; 9 returnKpot; 9

4nalisando a e)ecuo ...


pot(base=2, expoente=3) = 8 23 E1 2 * 22 E2 2*2 E3 2
1

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

Funo recursiva do %atorial em (continuao)


int3%atorial(int3n)3{ intKfK8K@+Ki; ifK0nK88KNKQQKnK88K@1 fK8K@; elseKfK8KnKBKfatorialK0nO@1; returnKf; 9

4nalisando a e)ecuo ...


fatorial (n=3) = 6 3! E1 3 * 2! E2 2 * 1! 1 E3 1 2 6

25/02/2014

4#licao de Recursividade
Problema '1

4eterminar o nOCsimo elemento da se)uLncia de =i%onacci. N R @ R @ R 2 R ? R J R F R @? R 2@ O ...

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

int %ibonacci(int #os) {

int n8O@; if 0pos 88 @1 n 8 N; eles 2 if 0pos 88 21 n 8 @; else 2 n 8 fi%onacci0posO@1 A fi%onacci0posO21; 9 9 9 return n; 9

4nalisando a e)ecuo ...


fib(4) = 2 fib(4) 1 fib(3) 1 fib(2) 0 1

+
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

i=0 f=5 meio = 2

meio

0
2

1
5

3
10

4
28

5
35

Resolvendo o #roblema ...


O =un!o de recorrLncia: %usca0el+Ki+Kf18%usca0vetor+Kel+Ki+KmeioO@1 'UK%usca0vetor+Kel+KmeioA@+Kf1
- Instncia com soluo conhecida: vetor(meio) == el nmero encontrado na posio pos - Condio de parada: N foi encontrado ou os ndices assumiram valor fora das dimenses do vetor.

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

4nalisando a e)ecuo ...

12

25/02/2014

Funo Recursiva 8 Iterativa


Praticamente todas as fun es recursivas podem ser convertidas para fun es iterativas. A condi!o de parada utili(ada na vers!o recursiva pode ser aproveitada em uma estrutura de repeti!o+ na vers!o iterativa.

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 da #ot/ncia em (continuao)


int3#otencia(int3b(3int3e)3{ intKpotK8K@+Ki; forK0i8K@;Ki-8e;KiAA1K2 potK8KpotKBK%; 9 returnKpot; 9

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

Funo iterativa (continuao)

do

%atorial

em

int3%atorial(int3n)3{ intKfK8K@+Ki; ifK0nK88KNKQQKnK88K@1 fK8K@; elseK2KforK0i8Kn;Ki/8@;KiOO1K2 fK8KfKBKi; 9 9 returnKf; 9

14

25/02/2014

Funo iterativa do %atorial em ,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;K9

Funo iterativa do %atorial em (continuao)


int3busca(int3vet67(3int3el(3int3i(3int3%)3{ intKmeio+Kpos8O@; Z.ileK0iK-8Kf1K2 meioK8K0iKAKf1KYK2; ifK0elK88KvetVmeioW1K2KYYnSKencontrado posK8Kmeio; fK8KiKO@;K9KYYparaKfinali(arKoKZ.ile elseKifK0elK-KvetVmeioW1K fK8KmeioKR @; elseKiK8KmeioKAK@;K 9K returnKpos;9

-onclus&es
RecursividadeKpodeKserKusadaKemKsitua esK espec&ficas; =un esKrecursivasKconsomemKmaisKmem#ria; =un esKrecursivasKpodemKrepresentarKsolu esK maisKele"antesKeKmaisKsimplesKemKal"unsKcasosK 0e$:Kmanipula!oKdeK*rvores1.

15

You might also like