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