Algoritmo e Estrutura de
Dados I
Aulas 16 – Recursividade
Márcia Marra
[email protected]
Recursividade
• Recursividade é a capacidade de um programa
(função ou procedimento) fazer uma ou mais
chamadas a si mesmo.
• Na execução de um programa recursivo, uma
pilha é responsável pelo armazenamento das
variáveis recursivas.
• Uma função recursiva tem que seguir duas
regras básicas:
– Ter uma condição de parada (para garantir que uma
chamada recursiva não criará um loop infinito)
– Tornar o problema mais simples
2
Recursividade
• Genericamente um módulo recursivo
segue o algoritmo abaixo:
SE <condição de parada satisfeita>
Retornar
senão Divida o problema num caso mais
simples utilizando recursão
3
Exemplo 1
• Apresente um esquema recursivo para
dividir dois número inteiros usando
contagens sucessivas. Por exemplo:
calcular A/B sendo A=18 e B=4.
• Condição de parada: Se a < b retorna 0
• Parte recursiva: Sabemos que dividir A por
B é o mesmo que descobrir quantas vezes
B cabe em A. Assim, para dividir 18 por 4
podemos contar o no. de vezes que 4
cabe dentro de 18
4
Exemplo 1
DIV(18/4)= 1 + n° de vezes que b=4 cabe dentro de a=14
1 + 1 + n° de vezes que b=4 cabe dentro de a=10 (14 - 4)
1 + 1 + 1+ n° de vezes que b=4 cabe dentro de a=6 (10 - 4)
1 + 1 + 1 + 1 + n° de vezes que b=4 cabe dentro de a=2 (6-4)
Retorna 0
Retorna 1 -> 1 + 0
Retorna 2 -> 1 + 1
Retorna 3 -> 1 + 2
Retorna 4 -> 3 + 1
5
Exemplo 1 – Implementação
#include <stdio.h>
int Multiplica(int a, int b) {
if (b== 0) return b;
else if (b == 1) return a;
else return a + Multiplica(a,b-1);
}
int main(){
int a, b, resultado;
printf("forneca valores para a e b");
scanf("%d%d", &a, &b);
resultado=Multiplica(a,b);
printf("resultado=%d",resultado);
return 0;
}
6
Exemplo 1 - Execução
7
Exemplo 2
Implementar a multiplicação de inteiros utilizando somas
sucessivas.
Exemplo: Calcular A X B para A=4 e B= 5
4 X 5 = 4 + (4 X 4)
4 + (4 X 3)
4 +(4 x 2)
4 + (4 X1)
Condições de parada:
• Quando B=1
• Se o valor dado para b é igual a 0
8
Exemplo 2 – Implementação
#include <stdio.h>
int Divide(int a, int b) {
if ( a < b) return 0;
else return 1 + Divide(a-b,b);
}
int main(){
int a, b, resultado;
printf("forneca valores para a e b: ");
scanf("%d%d", &a, &b);
resultado=Divide(a,b);
printf("resultado=%d",resultado);
return 0;
}
9
Exemplo 2 – Execução
10
Exemplo 3
Apresente um esquema recursivo para inverter uma linha de
texto.
Por exemplo, inverter a linha:
TudoBem
Condição de parada: exibir o 1o. caractere - T posição 0
Parte recursiva:
exibir m e inverter texto
exibir e e inverter texto
exibir B e inverter texto
exibir o e inverter texto
exibir d e inverter texto
exibir u e inverter texto
Exibir T e parar
11
Exemplo 3 - Solução
#include <stdio.h>
#include <string.h>
void Exibe_invertido(char mensagem[], int tamanho) {
if (tamanho >= 0) {
printf("%c ", mensagem[tamanho]);
Exibe_invertido(mensagem,tamanho-1);
}
return;
}
int main(){
char mensagem[10];
int tamanho;
printf("forneca a mensagem: ");
scanf("%s", mensagem);
tamanho=strlen(mensagem)-1;
Exibe_invertido(mensagem, tamanho);
return 0;
}
12
Exemplo 3 - Execução
13
Exemplo 4
Apresente um esquema recursivo para somar os
elementos de um vetor.
Por exemplo, seja V=[11, 2, 3, 14,15] e N=5
14
Exemplo 4 – Solução
#include <stdio.h>
int Soma_elementos(int V[], int N){
if (N ==0) return V[N];
else return (V[N]+ Soma_elementos(V, N-1));
}
int main() {
int i, N;
int *V;
printf("entre com a quantidade de numeros--> ");
scanf("%d", &N);
V = (int *)malloc(N*sizeof(int));
if (!V) {
printf("Memoria insuficiente.\n");
exit(1);
}
printf("entre com os numeros--> ");
for (i=0; i<N;i++) scanf("%d", &V[i]);
printf("resultado=%d\n", Soma_elementos(V,N-1));
return 0;
}
15
Exemplo 4 - Execução
16
Exemplo 5
Encontar o maior elemento de um vetor.
Modo recursivo:
O máximo de um vetor é o maior entre os
máximos de dois subvetores. Quando houver
apenas um elemento, este é o máximo.
17
Exemplo 5 - Solução
#include <stdio.h>
int maximo(int elemento1, int elemento2) {
if (elemento1 > elemento2) return (elemento1);
else return (elemento2);
}
int max_array(int array[], int a, int b) {
int mid, num, x;
if (a == b) return array[a]; /*Condição de parada */
else {
mid = (a+b)/2;
x= maximo(max_array(array, a, mid),
max_array(array, mid+1, b));
}
return x;
}
18
Exemplo 5 - continuação
int main() {
int i, N, inicio, fim;
int *V;
printf("entre com a quantidade de numeros--> ");
scanf("%d", &N);
V = (int *)malloc(N*sizeof(int));
if (!V) {
printf("Memoria insuficiente.\n");
exit(1);
}
printf("entre com os numeros--> ");
for (i=0; i<N;i++) scanf("%d", &V[i]);
inicio=0;
fim=N-1;
printf("resultado=%d\n", max_array(V,inicio, fim));
return 0;
}
19
Exemplo 5 - Execução
20
Download

Recursividade