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

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

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

Apresentações semelhantes


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

1 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 a)Não Recursiva: –N! = 1, para N=0; –N! = 1 x 2 x 3 x... x N, para N>=1; b)Recursiva: –N! = 1, para N=0; –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! =

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 = 0 atual = 1 seguinte = 1 Anterior = 1 atual = 1 seguinte = 2 Anterior = 1 atual = 2 seguinte = 3 Anterior = 2 atual = 3 seguinte = 5 Anterior = 3 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) = 0 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(5) fib(4) fib(3) Fib(2) fib(3) fib(1) fib(2) Fib(2) fib(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 2 4 = 2 3 * 2 = 2 3 = 2 2 * 2 = 2 2 = 2 1 * 2 = 2 1 = 2 0 * 2 = 2 0 =

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

20 Torres de Hannoi 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 "Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação."

Apresentações semelhantes


Anúncios Google