recursividade
play

Recursividade Aula 9 Em matemtica vrios objetos so definidos - PowerPoint PPT Presentation

Recursividade Aula 9 Em matemtica vrios objetos so definidos apresentando-se um processo que os produz. Ex PI (circunferncia/dimetro) Outra definio de um objeto por um processo o fatorial de um nmero


  1. Recursividade Aula 9

  2. � Em matemática vários objetos são definidos apresentando-se um processo que os produz. � Ex PI (circunferência/diâmetro) � Outra definição de um objeto por um processo é o fatorial de um número

  3. � Fatorial(n) ou n! � = n*(n-1)*(n-2)...(2)*1 se n >0 � =1 se n==0 � Se formulamos: � 0! = 0 � 1! = 1 � 2! = 2 * 1 � 3! = 3 * 2 * 1 � 4! = 4 * 3 * 2 * 1 � Não é possível listar a fórmula para fatorial de cada inteiro

  4. � Para evitar qualquer abreviatura e um cjto infinito de definições poderemos apresentar um algoritmo que aceite um número inteiro n e retorne n! prod = 1; for (x = n; x > 0; x--) prod *= x; return prod; ALGORITMO ITERATIVO: Requer de repetição explícita até uma condição ser satisfeita.

  5. � Um algoritmo pode ser considerado “ Um programa ideal ” sem quaisquer limitações práticas de um computador real e portanto pode ser usado para definir uma função matemática, entretanto uma função de C não serve como definição matemática da função fatorial por causa de limitações como precisão e tamanho finito de uma máquina real.

  6. � Examinemos detalhadamente a definição de n! que lista uma fórmula separada para cada valor de n � Ex 4! = 4 * 3 * 2 * 1 isso é igual a 4 * 3! � Para todo n>0 verificamos que n! = n* (n-1)! � Podemos definir: 0! = 1 1! = 1 * 0! 2! = 2 * 1! 3! = 3 * 2! 4! = 4 * 3! 5! = 5 * 4!

  7. � Se empregamos uma notação matemática temos que � n! = 1 se n == 0 � n! = n * (n - 1)! se n >0 � Definição de uma função em termos de se mesma, aparentemente circular. � Método conciso de escrever um número infinito de equações necessárias para definir n! � Definição RECURSIVA

  8. � A recursividade pode ser utilizada quando um problema puder ser definido em termos de si próprio. � Por exemplo, quando um objeto é colocado entre dois espelhos planos paralelos e frente a frente surge uma imagem recursiva, porque a imagem do objeto refletida num espelho passa a ser o objeto a ser refletido no outro espelho e, assim, sucessivamente. � Uma função recursiva chama ela mesma, mas com outros parâmetros.

  9. Algoritmos Recursivos � A idéia básica de um algoritmo recursivo consiste em diminuir sucessivamente o problema em um problema menor ou mais simples, até que o tamanho ou a simplicidade do problema reduzido permita resolvê-lo de forma direta, sem recorrer a si mesmo. � Quando isso ocorre, diz que o algoritmo atingiu uma condição de parada, a qual deve estar presente em pelo menos um local dentro algoritmo. � Sem esta condição o algoritmo não pára de chamar a si mesmo, até estourar a capacidade da pilha de execução, o que geralmente causa efeitos colaterais e até mesmo o término indesejável do programa.

  10. Componentes de um algoritmo recursivo � Condição de parada , quando a parte do problema pode ser resolvida diretamente, sem chamar de novo a função recursiva. � Outros comandos que resolvem uma parte do problema (chamando novamente a função recursiva);

  11. Algoritmos Recursivos f1(..) f1(..) f1(..) . .. ... ... ... ... ... ... ... chama f1(..) condição de chama f1(..) ... parada! ... ... ... fim

  12. 5! = 5 * 4! 1. 4! = 4 * 3! 2. 3! = 3 * 2! 3. 2! = 2 * 1! 4. 1! = 1 * 0! 5. 0! = 1 6. Cada caso é reduzido a um caso mais simples até chegarmos ao caso 0! Que é definido imediatamente como 1

  13. Se voltarmos 6’ 0! = 1 5’ 1! = 1 * 0! = 1 * 1 = 1 4’ 2! = 2 * 1! = 2 * 1 = 2 3’ 3! = 3 * 2! = 3 * 2 = 6 2’ 4! = 4 * 3! = 4 * 6 = 24 1’ 5! = 5 * 4! = 5 * 24 = 120

  14. � Se levamos esse processo a um algoritmos teremos if (n == 0) fact = 1; else { x = n -1; ache o valor de x! . Chame-o de y; fact = n * y;} Definição recursiva do processo do cálculo do fatorial

  15. int main(void) { int NUMERO, RESULTADO; scanf("%d", &NUMERO); RESULTADO = FAT(NUMERO); printf("%d\n", RESULTADO); } int FAT(int N) { int AUX; if(N == 0) // condição de parada return 1; AUX = N * FAT(N - 1); return AUX; } � LEMBRE-SE!! N é variável local da função FAT. � É melhor a definição recursiva de fatorial?

  16. � Programa principal: � Função FAT: main PRIMEIRA CHAMADA � NUMERO = 2 � N = 2 RESULTADO = AUX = 2 * FAT(1) FAT(2) 1

  17. � Função FAT: � Função FAT: PRIMEIRA CHAMADA SEGUNDA CHAMADA � N = 2 � N = 1 AUX = 2 * FAT(1) AUX = 1 * FAT(0) 1 2

  18. � Função FAT: � Função FAT: SEGUNDA CHAMADA TERCEIRA CHAMADA � N = 1 � N = 0 AUX = 1 * FAT(0) condição de parada atingida!!! if (N = = 0) return 1; 2 3

  19. � Função FAT: � Função FAT: SEGUNDA CHAMADA TERCEIRA CHAMADA � N = 1 � N = 0 AUX = 1 * FAT(0) condição de parada atingida!!! 1 if (N = = 0) return 1; AUX = 1 2 3

  20. � Função FAT: � Função FAT: PRIMEIRA CHAMADA SEGUNDA CHAMADA � N = 2 � N = 1 AUX = 2 * FAT(1) AUX = 1 * FAT(0) 1 1 AUX = 1 AUX = 2 2 1

  21. � Programa principal: � Função FAT: main PRIMEIRA CHAMADA � NUMERO = 2 � N = 2 AUX = 2 * FAT(1) RESULTADO = FAT(2) 2 2 AUX = 2 RESULTADO = 2 1

  22. Problemas associados a recursividade � ����������������������������� � �������������������������� ������������� ���������� ������� �������� � ���� ��������� �������� ������������������������������ ��� ��� ������ ������ �� ���� ����� ������� �� �������� ��������� ���������� ! � ��� ������"����� ���������� ����� ��� ����"�������������������������������������� ��� �#������� ��� �������$� ���� ����� ��� �����%������ �����������������������!

  23. Multiplicação de números naturais � Outro exemplo de definição recursiva � O produto A*B em que a e b são inteiros positivos pode ser definido como A somado a se mesmo b vezes. Essa definição é ITERATIVA � Definição recursiva a * b = a se b == 1 a * b = a * (b - 1) + a se b > 1

  24. � Exemplo: 6 * 3 = 6 * 2 + 6 = 6 * 1 + 6 + 6 = 6 + 6 + 6 = 18 Exercício: Converter num algoritmo recursivo. Observe padrão de definições recursivas (caso simples e avaliação de casos mais simples) Por que não podemos usar definições como ?? n! = (n + 1)! / (n + 1) a * b = a * (b + 1) - a

  25. A seqüência de Fibonacci � Seqüência de inteiros do tipo � 0, 1, 2, 2, 3, 5, 8, 13, 21, 34 � Cada elemento da seqüência é a soma dos dois elementos anteriores. Se permitimos que fib(0) = 0 e fib(1) = 1 � fib(n) = n se n == 0 ou n == 1 � fib(n) = fib(n-2) + fib(n-1) se n >= 2 � Que diferencia a definição da seqüência de Fibonacci da do fatorial e da multiplicação dos números naturais??

  26. A seqüência de Fibonacci � Note que: � fib(6) = fib(5) + fib(4) = fib(4) + fib(3) + fib(3) + fib(2) � = fib(3) + fib(2) + fib(3) + fib(3) + fib(2) � E assim por diante. Que tem de errado?????? Seria mais eficiente lembrar quanto é fib(3) na primeira vez que ele for chamado

  27. Solução iterativa: if (n <= 1) return(n); lofib = 0; hifib = 1; for (i = 2; i <= n; i++) { x = lofib; lofib = hifib; hifib = x + lofib; } return hifib;

  28. Solução recursiva

  29. FIB(5)

  30. FIB(5) FIB(4) FIB(3)

  31. FIB(5) FIB(4) FIB(3) FIB(3) FIB(2)

  32. FIB(5) FIB(4) FIB(3) FIB(3) FIB(2) FIB(2) FIB(1)

  33. FIB(5) FIB(4) FIB(3) FIB(3) FIB(2) FIB(2) FIB(1) FIB(2) FIB(1)

  34. FIB(5) FIB(4) FIB(3) FIB(3) FIB(2) FIB(2) FIB(1) 1 FIB(1)

  35. FIB(5) FIB(4) FIB(3) FIB(3) FIB(2) FIB(2) FIB(1) 1 1

  36. FIB(5) FIB(4) FIB(3) 2 FIB(2) FIB(2) FIB(1) 1 1

  37. FIB(5) FIB(4) FIB(3) 2 1 FIB(2) FIB(1) 1 1

  38. FIB(5) FIB(4) FIB(3) 2 1 1 FIB(1) 1 1

  39. FIB(5) FIB(4) FIB(3) 2 1 1 1 1 1

  40. FIB(5) 3 FIB(3) 2 1 1 1 1 1

  41. FIB(5) 3 2 2 1 1 1 1 1

  42. 5 3 2 2 1 1 1 Resposta: O 5º termo da série é 5. 1 1

  43. Torres de Hanoi � Problema criado pelo matemático francês Edouard Lucas, em 1883; � 3 torres; � x discos de vários tamanhos na primeira torre; � Objetivo: transportar os discos, 1 a 1, para a terceira torre; � Regras: � nunca colocar um disco maior sobre um disco menor; � pode-se mover um único disco por vez; � nunca colocar um disco noutro lugar que não numa das três hastes.

  44. Torres de Hanoi

Recommend


More recommend