Recursividade Prof. Alex F. V. Machado - ppt carregar
PublicouMelissa Cassis Alterado mais de 7 anos atrás
Apresentação em tema: "Recursividade Prof. Alex F. V. Machado"— Transcrição da apresentação:
1 Recursividade Prof. Alex F. V. Machado alexcataguases@hotmail.como
2 Recursão É o equivalente em programação da indução matemática que é uma maneira de definir algo em termos de si mesmo.
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 –Redução do tamanho do código fonte –Permite descrever algoritmos de forma mais clara e concisa Desvantagens –Redução do desempenho de execução devido ao tempo para gerenciamento de chamadas –Dificuldades na depuração de programas recursivos, especialmente se a recursão for muito profunda
4 Implementação da Recursividade Usa-se uma pilha para armazenar os dados usados em cada chamada de um procedimento / função que não terminou Todos os dados não globais são armazenados na pilha, informando o resultado corrente Quando uma ativação anterior prossegue, os dados da pilha são recuperados
5 Recursividade Existe a recursão direta – quando uma função chama a si mesma diretamente. E a recursão indireta – quando uma função chama outra, e esta, por sua vez chama a primeira.
6 Recursividade Uma função pode ser implementada de forma interativa ou recursiva. – quase sempre a forma recursiva apresenta uma codificação mais simples (reduzida). –Por outro lado, implementações interativas tendem a ser mais eficientes (performance) que as recursivas.
8 Funções Recursivas contem duas partes principais Ou.... Caso Base e Caso Recursivo
10 Tipos de Recursão - Recursão Linear - Recursão Binária - Recursão com Múltiplas Chamadas
11 Exemplo 1: Fatorial /* calculo do fatorial – função recursiva */ int fat(int n) { if (n==1){ return 1; }else{ return n*fat(n-1); }
12 Exemplo 2: Fibonacci /* calculo do valor fibonacci – função recursiva */ int fibonacci(int t){ if (t==1 || t==2) { return 1; }else{ return fibonacci (t-1)+fibonacci (t-2); }
13 Exemplo 3: Algoritmo de Preenchimento - Algoritmo recursivo - Preenche vizinhos da semente que atendem ao critério - Aplica o algoritmo recursivamente tomando esses vizinhos como sementes - Termina quando nenhum vizinho atende o critério
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); }
15 Exercícios: 1. Crie uma função recursiva que calcule a exponenciação de um valor b por um expoente p sem usar o operador de exponenciação. 2. Escreva uma função recursiva que escreva na tela todos os números inteiros positivos desde um valor K informado pelo usuário até 0. 3. Escreva um algoritmo recursivo que escreva na tela a soma de todos os números inteiros positivos de K até 0. 4. Escreva uma função recursiva que calcule a soma de todos os números compreendidos entre os valores A e B passados por parâmetro. 5. Escreva uma função recursiva que calcule os juros compostos de um valor. Para isso o programa deverá ler um valor inicial, o número de meses e a taxa de juros ao mês, e passar estes valores à função como parâmetros. 6. Escreva uma função que faça a procura sequencial de um valor passado por parâmetro num vetor também passado por parâmetro.
16 Exemplo 4: Potência /*calculo da potencia – função recursiva */ double potencia (float b, int p) { if (p==0) return 1; else return b*potencia(b, p-1); }
17 Exemplo 5: Busca Binária 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); }