A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

Apresentações semelhantes


Apresentação em tema: "Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação"— Transcrição da apresentação:

1 Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação
Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação

2 Recursividade

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 Exemplo – Função Fatorial
Definição de uma Função Fatorial Não Recursiva: N! = 1, para N=0; N! = 1 x 2 x 3 x ... x N, para N>=1; Recursiva: N! = N x (N – 1), para N>=1;

6 Fatorial de N – Definição Iterativa
Se n = 0 Então Fat(n) = 1 Se n > 0 Então Fat(n) = 1 x 2 x 3 x …N

7 int fat(int fatorial){
int i; int resposta = 1; if (fatorial == 0) resposta = 1; else if (fatorial > 0) for(i=1;i <= fatorial; i++) resposta = resposta * i; return resposta; }

8 Fatorial de N – Definição Recursiva
Se n = 0 Então Fat(n) = 1 Se n > 0 Então Fat(n) = n x Fat(n – 1)

9 Fatorial de N – Definição Recursiva
Ex: 4! 4! = 4 x 3! = 3! = 3 x 2! = 2! = 2 x 1! = 1! = 1 x 0! = 0! = 1 24 6 2 1

10 int fat_recursivo(int fatorial){
int i; int resposta = 1; if (fatorial == 0) resposta = 1; else if (fatorial > 0) for(i=1;i <= fatorial; i++) resposta = fatorial * fat_recursivo(fatorial-1); return resposta; }

11 Sequência de Fibonacci – Definição Iterativa
Simulação: Anterior = atual = 1 seguinte = 1 Anterior = atual = 1 seguinte = 2 Anterior = atual = 2 seguinte = 3 Anterior = atual = 3 seguinte = 5 Anterior = atual = 5 seguinte = 8 ….

12 int fib(int fibonacci){
int i; int anterior, atual, seguinte; if (fibonacci == 1) return 0; else if (fibonacci == 2) return 1; else { anterior = 0; atual = 1; for(i=3;i <= fibonacci; i++) { seguinte = atual + anterior; anterior = atual; atual = seguinte; } return atual; } }

13 Sequência de Fibonacci – Definição Recursiva
fib(1) = fib(2) = 1 fib(3) = fib(2) + fib(1) fib(4) = fib(3) + fib(2) Fib(n) = fib(n-1) + fib(n - 2)

14 Sequência de Fibonacci – Definição Recursiva
fib(4) fib(3) Fib(2) fib(3) fib(1) fib(2) Fib(2) fib(1) 3 2 + 1 + + 1 1 1 + 1

15 int fib_recursivo(int fibonacci){
int i; int anterior, atual, seguinte; if (fibonacci == 1) return 0; else if (fibonacci == 2) return 1; else return fib_recursivo(fibonacci - 1) + fib_recursivo(fibonacci - 2); }

16 MDC(a,b): Iterativo int mdc(int a, int b){ int resto; while (b != 0) {
resto = (a % b); a = b; b = resto; } return a;

17 MDC(a,b): Recursivo int mdc_recursivo(int a, int b){ if (b == 0) return a; else return mdc_recursivo(b, a % b); }

18 Potência: Definição Recursiva
24 = 23 * 2 = 23 = 22 * 2 = 22 = 21 * 2 = 21 = 20 * 2 = 20 = 1 16 8 4 2

19 Potência: Definição Recursiva
int pot_recursivo(int a, int b){ if (b == 0) return 1; else return (pot_recursivo(a, b-1) * a); }

20 Torres de Hannoi em Java
O objetivo deste jogo é mover todas as peças da coluna esquerda para a coluna da direita Você só pode mover uma haste de cada vez As peças devem ser empilhadas obedecendo o tamanho das mesmas, ficando as menores sobre as maiores. Torres de Hannoi em Java

21 Dicas Não se aprende recursividade sem praticar
Para montar um algoritmo recursivo Defina pelo menos um caso básico (condição de terminação); Quebre o problema em problemas menores, definindo o(s) caso(s) com recursão(ões) Fazer o teste de finitude, isto é, certificar-se de que as sucessivas chamadas recursivas levam obrigatoriamente, e numa quantidade finita de vezes, ao(s) caso(s) básico(s)

22 Finalizando Recursividade é um tópico fundamental
Algoritmos recursivos aparecem bastante na prática Dividir e conquistar é uma técnica naturalmente recursiva para solução de problemas Mais recursividade no nosso futuro, principalmente na implementação de árvores...


Carregar ppt "Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação"

Apresentações semelhantes


Anúncios Google