Algoritmo e Estrutura de Dados I

Apresentações semelhantes


Apresentação em tema: "Algoritmo e Estrutura de Dados I"— Transcrição da apresentação:

1 Algoritmo e Estrutura de Dados I
Aulas 16 – Recursividade Márcia Marra

2 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

3 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

4 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

5 Exemplo 1 DIV(18/4)= 1 + n° de vezes que b=4 cabe dentro de a=14
Retorna 0 Retorna 1 -> 1 + 0 Retorna 2 -> 1 + 1 Retorna 3 -> 1 + 2 Retorna 4 -> 3 + 1

6 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;

7 Exemplo 1 - Execução

8 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

9 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;

10 Exemplo 2 – Execução

11 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

12 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;

13 Exemplo 3 - Execução

14 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

15 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;

16 Exemplo 4 - Execução

17 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.

18 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;

19 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;

20 Exemplo 5 - Execução


Carregar ppt "Algoritmo e Estrutura de Dados I"
Anúncios Google