43
7/17/2019 recursao http://slidepdf.com/reader/full/recursao-56913904d7015 1/43 Fun¸ oes Recursivas Instituto de Computa¸ c˜ao - UNICAMP Disciplina MC102

recursao

Embed Size (px)

DESCRIPTION

aula sobre algoritmos recursivos

Citation preview

Page 1: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 1/43

Funcoes Recursivas

Instituto de Computacao - UNICAMP

Disciplina MC102

Page 2: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 2/43

Funcoes Recursivas: Exemplos

Fatorial, SomaMaximo divisor comum

Sequencia de Fibonacci

Exponenciacao

Maximo de um vetor

Media de um vetor

Maior e menor de um vetor

Comprimento de uma string

Busca Binaria

Divisao de inteiros

Disciplina MC102

Page 3: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 3/43

Fatorial

n! = 1 × 2 × 3 · · · × n,   0! = 1

Disciplina MC102

Page 4: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 4/43

Fatorial

n! = 1 × 2 × 3 · · · × n,   0! = 1

fatorial (n − 1) −−−−−− >  fatorial (n)?

Disciplina MC102

Page 5: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 5/43

Fatorial

n! = 1 × 2 × 3 · · · × n,   0! = 1

fatorial (n − 1) −−−−−− >  fatorial (n)?

fatorial (n) =   n ∗ fatorial (n − 1);fatorial (0) = 1.

Disciplina MC102

Page 6: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 6/43

Fatorial

n! = 1 × 2 × 3 · · · × n,   0! = 1

fatorial (n − 1) −−−−−− >  fatorial (n)?

fatorial (n) =   n ∗ fatorial (n − 1);fatorial (0) = 1.

fatorial (6) = 6 ∗ fatorial (5)= 6 ∗ (5 ∗ fatorial (4))= 6 ∗ (5 ∗ (4 ∗ fatorial (3)))

= 6 ∗ (5 ∗ (4 ∗ (3 ∗ fatorial (2))))= 6 ∗ (5 ∗ (4 ∗ (3 ∗ (2 ∗ fatorial (1)))))= 6 ∗ (5 ∗ (4 ∗ (3 ∗ (2 ∗ (1 ∗ fatorial (0))))))= 6 ∗ (5 ∗ (4 ∗ (3 ∗ (2 ∗ (1 ∗ 1)))))= 720.

Disciplina MC102

Page 7: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 7/43

Fatorial em C

fatorial (0) = 1;fatorial (n) =   n ∗ fatorial (n − 1).

int fatorial(int n){

if (n == 0) return 1;

return n * fatorial(n-1);

}

Disciplina MC102

Page 8: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 8/43

Soma

Problema: calcular a soma 1 + 2 + 3 +   · · ·   +  n − 1 + n

Disciplina MC102

S

Page 9: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 9/43

Soma

Problema: calcular a soma 1 + 2 + 3 +   · · ·   +  n − 1 + n

soma(n) =   n + soma(n − 1);soma(1) = 1.

Disciplina MC102

S

Page 10: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 10/43

Soma

Problema: calcular a soma 1 + 2 + 3 +   · · ·   +  n − 1 + n

soma(n) =   n + soma(n − 1);soma(1) = 1.

soma(6) = 6 + soma(5)= 6 + (5 + soma(4))= 6 + (5 + (4 + soma(3)))= 6 + (5 + (4 + (3 + soma(2))))

= 6 + (5 + (4 + (3 + (2 + soma(1)))))= 6 + (5 + (4 + (3 + (2 + (1 + 1))))) = 21

Disciplina MC102

S C

Page 11: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 11/43

Soma em C

soma(1) = 1;

soma(n) =   n  + soma(n − 1).

/*version 1:-->chamar: a = soma(n);*/

int soma(int n){

if (n == 1) return 1;

return n + soma(n-1);}

/*version 2:--> chamar: a = somaR(n,0);*/

int somaR(int n, int s){

if (n == 0) return s;return somaR(n-1,n+s);

}

Disciplina MC102

S d l t d t

Page 12: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 12/43

Soma dos elementos de um vetor

Problema: calcular a soma dos elementos de um vetor  v [0...n − 1](n  elementos)

Disciplina MC102

S d l t d t

Page 13: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 13/43

Soma dos elementos de um vetor

Problema: calcular a soma dos elementos de um vetor  v [0...n − 1](n  elementos)

/* algoritmo iterativo*/

int soma(int v[], int n){

int s = 0, i;

for (i=0; i< n; i++)

s + = v[i];return s;

}

Disciplina MC102

S d s l t s d t

Page 14: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 14/43

Soma dos elementos de um vetor

Problema: calcular a soma dos elementos de um vetor  v [0...n − 1](n  elementos)

/* algoritmo iterativo*/

int soma(int v[], int n){

int s = 0, i;

for (i=0; i< n; i++)

s + = v[i];return s;

}

/* algoritmo recursivo*/

int soma_r(int v[], int n){

if ( n == 1) return v[0];

return v[n-1] + soma_r(v,n-1);

}

Disciplina MC102

Maximo Divisor Comum

Page 15: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 15/43

Maximo Divisor Comum

mdc (a, b ) =   mdc (b , a  mod  b  );mdc (a, 0) =   a.

Disciplina MC102

Maximo Divisor Comum

Page 16: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 16/43

Maximo Divisor Comum

mdc (a, b ) =   mdc (b , a  mod  b  );mdc (a, 0) =   a.

mdc (642, 36) =   mdc (36, 30)=   mdc (30, 6)=   mdc (6, 0)= 6.

Disciplina MC102

Maximo Divisor Comum em C

Page 17: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 17/43

Maximo Divisor Comum em C

mdc (a, 0) =   a;mdc (a, b ) =   mdc (b , a  mod  b  ).

/* Func~ao para calular o mdc de a e b: a>=b >=0 */

int mdc(int a, int b){

if (b == 0) return a;

return mdc(b,a % b);

}

Disciplina MC102

Fibonacci recursivo em C:

Page 18: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 18/43

Fibonacci recursivo em C:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55,...

Disciplina MC102

Fibonacci recursivo em C:

Page 19: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 19/43

Fibonacci recursivo em C:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55,...

Fibonacci (0) = 0;Fibonacci (1) = 1;Fibonacci (n) =   Fibonacci (n − 1) + Fibonacci (n − 2).

Disciplina MC102

Fibonacci recursivo em C:

Page 20: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 20/43

Fibonacci recursivo em C:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55,...

Fibonacci (0) = 0;Fibonacci (1) = 1;Fibonacci (n) =   Fibonacci (n − 1) + Fibonacci (n − 2).

int fibonacci(int n) {

if (n <= 1) return n; /* n>=0*/;

return fibonacci(n-1) + fibonacci(n-2);

}

Disciplina MC102

Fibonacci iterativo em C:

Page 21: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 21/43

Fibonacci iterativo em C:

int fibonacci_iterativo(int n) {

int f0 = 0, f1 = 1,f2, i;

if (n <= 1) return n;

for(i=0; i<= n-2; i++){

f2 = f1 + f0;

f0 = f1;

f1 = f2;

}return f2;

}

Disciplina MC102

Exponenciacao

Page 22: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 22/43

Exponenciacao

Problema: calcular  an =  a · a · a · · · a

   n  vezes

Disciplina MC102

Exponenciacao

Page 23: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 23/43

Exponenciacao

Problema: calcular  an =  a · a · a · · · a

   n  vezes

/* algoritmo iterativo*/

int exp_it(int a, int n){

int p = 1, i;

if (n == 0) return 1;

for (i=1; i<= n; i++)

p = p * a;

return p;

}

Disciplina MC102

Exponenciacao-Recursiva I

Page 24: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 24/43

p ¸

an =   1 se  n = 0;

a · an−1 se  n > 0.

Disciplina MC102

Exponenciacao-Recursiva I

Page 25: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 25/43

p ¸

an =   1 se  n = 0;

a · an−1 se  n > 0.

/* algoritmo recursivo 1:*/

int exp_r(int a, int n){

if ( n==0) return 1;

return a * exp_r(a,n-1);}

Disciplina MC102

Exponenciacao-Recursiva II

Page 26: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 26/43

p ¸

an =

  a · (an/2)2 se  n  ımpar;

(an/2)2 se  n  par.

Exemplo:   a24

a24 =   a12  2

=  · · · =   a ·   a  2

  2  2

  2

4 quadrados + 1 multiplicacao (melhor que 23 multiplicacoes!)

Disciplina MC102

Exponenciacao-Recursiva II

Page 27: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 27/43

p ¸

an =   a · (an/2)2 se  n  ımpar;

(an/2)2 se  n  par.

/* algoritmo recursivo: 2*/

int exp_r2(int a, int n){

int b;

if ( n==0) return 1;

b = exp_r2(a,n/2);

if (n % 2 == 1) return a*b*b;

else return b*b;

}

Disciplina MC102

Maximo de um vetor:

Page 28: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 28/43

Problema: encontrar o valor do maior elemento do vetorv [0...n − 1] (n  elementos)

Disciplina MC102

Maximo de um vetor:

Page 29: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 29/43

Problema: encontrar o valor do maior elemento do vetorv [0...n − 1] (n  elementos)

int maior(int v[], int n){ /* algoritmo iterativo: */int x = v[0], i;

for (i=1; i< n; i++)

if (x < v[i]) x = v[i];

return x;

}

Disciplina MC102

Maximo de um vetor:

Page 30: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 30/43

Problema: encontrar o valor do maior elemento do vetorv [0...n − 1] (n  elementos)

int maior(int v[], int n){ /* algoritmo iterativo: */int x = v[0], i;

for (i=1; i< n; i++)

if (x < v[i]) x = v[i];

return x;

}

int maior_r(int v[], int n){ /* algoritmo recursivo: */

int x;

if ( n==1) return v[0];

x = maior_r(v,n-1);

if (x > v[n-1]) return x;

else return v[n-1];

}

Disciplina MC102

Media de um vetor:

Page 31: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 31/43

Problema: escreva uma funcao recursiva para calcular a media deum vetor de  n  elementos.

Disciplina MC102

Media de um vetor:

Page 32: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 32/43

Problema: escreva uma funcao recursiva para calcular a media deum vetor de  n  elementos.

double Media (double v[], int n){

double m;

if (n == 1) return (v[0]);

 m = Media (v,n-1);

return ( (m * (n-1) + v[n-1])/(double) n);

}

Disciplina MC102

Maximo e Mınimo de um vetor:

Page 33: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 33/43

Problema: escreva uma funcao recursiva para calcular a diferenca

entre o maior elemento e o menor elemento de um vetor de  nnumeros inteiros.

Disciplina MC102

Maximo e Mınimo de um vetor:

Page 34: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 34/43

Problema: escreva uma funcao recursiva para calcular a diferenca

entre o maior elemento e o menor elemento de um vetor de  nnumeros inteiros.

int MaxMin(int v[], int i, int f, int *min, int *max){

int s0,s1,t0,t1,j;

if ( i==f) {*min = *max= v[i]; return 0;}j = i + (f-i)/2;

MaxMin(v,i ,j,&s0,&s1);

MaxMin(v,j+1,f,&t0,&t1);

if (s0 < t0) *min = s0; else *min = t0;

if (s1 < t1) *max = t1; else *max = s1;return (*max -*min);

}

Disciplina MC102

Maximo e Mınimo de um vetor....:

Page 35: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 35/43

int main(){

int d,i, menor, maior, n, v[100];

scanf("%d",&n);

for(i=0;i<n;i++) scanf("%d", &v[i]);

......d = MaxMin(v,0,n-1,&menor,&maior);

printf("Diferenca igual =%d",d);

return 0;

}

Disciplina MC102

Comprimento de uma string:

Page 36: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 36/43

Problema: escreva uma funcao recursiva para calcular ocomprimento de uma cadeia de caracteres.

Disciplina MC102

Comprimento de uma string:

Page 37: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 37/43

Problema: escreva uma funcao recursiva para calcular ocomprimento de uma cadeia de caracteres.

int comprimento(char s[]){

if (s[0] ==’\0’) return 0;

else return (1 + comprimento(&s[1]));

}

Disciplina MC102

Comprimento de uma string:

Page 38: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 38/43

Problema: escreva uma funcao recursiva para calcular ocomprimento de uma cadeia de caracteres.

int comprimento(char s[]){

if (s[0] ==’\0’) return 0;

else return (1 + comprimento(&s[1]));

}

Versao 2:

int comprimento(char *s){

if (*s ==’\0’) return 0;else return (1 + comprimento(s+1));

}

Disciplina MC102

Numero de Dıgitos Pares

Page 39: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 39/43

Problema: escreva uma funcao recursiva para calcular o numero dedıgitos pares de um numero inteiro  n  ∈ [0, 2.147.483.647]

Disciplina MC102

Numero de Dıgitos Pares

Page 40: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 40/43

Problema: escreva uma funcao recursiva para calcular o numero dedıgitos pares de um numero inteiro  n  ∈ [0, 2.147.483.647]

int QPares(int n){ /* caso base n = 0,1,2,3,4,5,6,7,8,9*/

if (n<10) return 1-n%2;

else return (QPares(n/10) + 1-n%2);

}

Disciplina MC102

Numero de Dıgitos Pares

Page 41: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 41/43

Problema: escreva uma funcao recursiva para calcular o numero dedıgitos pares de um numero inteiro  n  ∈ [0, 2.147.483.647]

int QPares(int n){ /* caso base n = 0,1,2,3,4,5,6,7,8,9*/

if (n<10) return 1-n%2;

else return (QPares(n/10) + 1-n%2);

}

Versao 2:

int QPares(int n){ /* caso base n = 0,1,2,3,4,5,6,7,8,9*/

int d = 1 -n%2;if (n<10) return d;

else return (QPares(n/10) + d);

}

Disciplina MC102

Busca Binaria

Page 42: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 42/43

Problema: escreva uma funcao recursiva para fazer uma busca dex  no vetor  v [ini ..fim] (ordenado)

int buscaBR( int x, int ini, int fim, int v[]) {

if (ini > fim) return -1; /* base da recurs~ao*/

else {

int m = ini + (fim-ini)/2;

if (x == v[m]) return m;

if ( x < v[m]) return buscaBR( x, ini, m-1, v);

else return buscaBR( x, m+1, fim, v);

}}

Disciplina MC102

Divisao de inteiros

Page 43: recursao

7/17/2019 recursao

http://slidepdf.com/reader/full/recursao-56913904d7015 43/43

Problema: escreva uma funcao recursiva para calcular o quocientede dois numeros inteiros  a  ≥ 0, b  > 0;  q  = DIV (a, b ) = a/b 

ab 

  = 1 +  a − b b 

int divR( int a, int b) {

int q;

if (a < b){ q = 0;}

else{

a = a - b ;q = 1 + divR(a,b);

}

return q;

}

Disciplina MC102