Upload
anonymous-cg3k1d
View
217
Download
1
Embed Size (px)
DESCRIPTION
aula sobre algoritmos recursivos
Citation preview
7/17/2019 recursao
http://slidepdf.com/reader/full/recursao-56913904d7015 1/43
Funcoes Recursivas
Instituto de Computacao - UNICAMP
Disciplina MC102
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
7/17/2019 recursao
http://slidepdf.com/reader/full/recursao-56913904d7015 3/43
Fatorial
n! = 1 × 2 × 3 · · · × n, 0! = 1
Disciplina MC102
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
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
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
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
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
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
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
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
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
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
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
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
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
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:
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:
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:
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:
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
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
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
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
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
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
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:
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:
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:
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:
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:
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:
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:
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....:
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:
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:
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:
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
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
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
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
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
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