of 17 /17
Recursividade Prof. Alex F. V. Machado [email protected]

Recursividade Prof. Alex F. V. Machado [email protected]

Embed Size (px)

Text of Recursividade Prof. Alex F. V. Machado [email protected]

  • Slide 1
  • Recursividade Prof. Alex F. V. Machado [email protected]
  • Slide 2
  • Recurso o equivalente em programao da induo matemtica que uma maneira de definir algo em termos de si mesmo.
  • Slide 3
  • Conceito de Recursividade Um programa recursivo um programa que chama a si mesmo, direta ou indiretamente Conceito poderoso Define conjuntos infinitos com comandos finitos Vantagens Reduo do tamanho do cdigo fonte Permite descrever algoritmos de forma mais clara e concisa Desvantagens Reduo do desempenho de execuo devido ao tempo para gerenciamento de chamadas Dificuldades na depurao de programas recursivos, especialmente se a recurso for muito profunda
  • Slide 4
  • Implementao da Recursividade Usa-se uma pilha para armazenar os dados usados em cada chamada de um procedimento / funo que no terminou Todos os dados no globais so armazenados na pilha, informando o resultado corrente Quando uma ativao anterior prossegue, os dados da pilha so recuperados
  • Slide 5
  • Recursividade Existe a recurso direta quando uma funo chama a si mesma diretamente. E a recurso indireta quando uma funo chama outra, e esta, por sua vez chama a primeira.
  • Slide 6
  • Recursividade Uma funo pode ser implementada de forma interativa ou recursiva. quase sempre a forma recursiva apresenta uma codificao mais simples (reduzida). Por outro lado, implementaes interativas tendem a ser mais eficientes (performance) que as recursivas.
  • Slide 7
  • Slide 8
  • Funes Recursivas contem duas partes principais Ou.... Caso Base e Caso Recursivo
  • Slide 9
  • 1 2 3 4
  • Slide 10
  • Tipos de Recurso - Recurso Linear - Recurso Binria - Recurso com Mltiplas Chamadas
  • Slide 11
  • Exemplo 1: Fatorial /* calculo do fatorial funo recursiva */ int fat(int n) { if (n==1){ return 1; }else{ return n*fat(n-1); }
  • Slide 12
  • Exemplo 2: Fibonacci /* calculo do valor fibonacci funo recursiva */ int fibonacci(int t){ if (t==1 || t==2) { return 1; }else{ return fibonacci (t-1)+fibonacci (t-2); }
  • Slide 13
  • Exemplo 3: Algoritmo de Preenchimento - Algoritmo recursivo - Preenche vizinhos da semente que atendem ao critrio - Aplica o algoritmo recursivamente tomando esses vizinhos como sementes - Termina quando nenhum vizinho atende o critrio
  • Slide 14
  • Exemplo 3: Algoritmo de Preenchimento /*considerar pixel[] sendo uma matriz global */ void FloodFill (int x, int y, int cor, int novaCor) { If (pixel [x, y] == cor) { pixel [x, y] = novaCor; FloodFill (x + 1, y, cor, novaCor); FloodFill (x, y + 1, cor, novaCor); FloodFill (x - 1, y, cor, novaCor); FloodFill (x, y - 1, cor, novaCor); }
  • Slide 15
  • Exerccios: 1. Crie uma funo recursiva que calcule a exponenciao de um valor b por um expoente p sem usar o operador de exponenciao. 2. Escreva uma funo recursiva que escreva na tela todos os nmeros inteiros positivos desde um valor K informado pelo usurio at 0. 3. Escreva um algoritmo recursivo que escreva na tela a soma de todos os nmeros inteiros positivos de K at 0. 4. Escreva uma funo recursiva que calcule a soma de todos os nmeros compreendidos entre os valores A e B passados por parmetro. 5. Escreva uma funo recursiva que calcule os juros compostos de um valor. Para isso o programa dever ler um valor inicial, o nmero de meses e a taxa de juros ao ms, e passar estes valores funo como parmetros. 6. Escreva uma funo que faa a procura sequencial de um valor passado por parmetro num vetor tambm passado por parmetro.
  • Slide 16
  • Exemplo 4: Potncia /*calculo da potencia funo recursiva */ double potencia (float b, int p) { if (p==0) return 1; else return b*potencia(b, p-1); }
  • Slide 17
  • Exemplo 5: Busca Binria int busca (int chave, int inicio, int final, int v[]){ int meio; if (inicio >= final){ // se ini == fim return v[final]; } else { meio = (inicio + final)/2; if(v[meio] == chave) return v[meio]; if (v[meio] < chave) return busca (chave, meio + 1, final, v); else return busca (chave, inicio, meio - 1, v); }