You are on page 1of 60

Recursividade, Tentativa e Erro

Tlio Toffolo www.toffolo.com.br Marco Antnio Carvalho marco.opt@gmail.com

BCC402 Aula 07 Algoritmos e Programao Avanada

Na aula anterior
! Prova

Na aula de hoje
! Tcnicas bsicas de contagem; ! Tentativa e Erro; ! Recursividade.

Problemas Combinatrios
! Combinatria a matemtica do contar
! Existem diversos problemas bsicos de contagem que ocorrem repetidamente em cincia da computao e em programao.

! Problemas Combinatrios so aqueles em que uma soluo a combinao de um subconjunto de elementos


! So famosos por sua relao com a esperteza e insights; ! Uma vez que se coloca o problema sob a perspectiva certa, a soluo pode se tornar bvia.
4

Problemas Combinatrios
! O espao de busca de um problema combinatrio o conjunto de todas as solues possveis, podendo ser restrito as solues viveis ou no; ! Uma soluo vivel uma soluo completa, que atende aos requisitos do problema; ! Uma soluo invivel uma soluo incompleta ou mesmo uma soluo nula.

Problemas Combinatrios
! Ainda, podemos ter solues equivalentes, ou seja, mais de uma soluo vivel par ao mesmo problema; ! Alguns problemas possuem uma soluo melhor que todas as outras, chamada de soluo tima.

Tcnicas Bsicas de Contagem


! Basicamente, existem trs regras bsicas de contagem a partir das quais vrias formas de contagem so geradas: ! Regra da Soma; ! Regra do Produto; ! Regra de Incluso-Excluso.

Tcnicas Bsicas de Contagem


! Regra da Soma: ! Se h |A| possibilidades em um conjunto A e |B| possibilidades em um conjunto B, ento h |A|+|B| possibilidades de A ou B ocorrerem, assumindo que os conjuntos possuem elementos distintos.

Tcnicas Bsicas de Contagem


! Regra do Produto: ! Se h |A| possibilidades em um conjunto A e |B| possibilidades em um conjunto B, ento h |A|!|B| formas de combinar um elemento de A com um elemento de B.

Tcnicas Bsicas de Contagem


! Regra da Incluso-Excluso: ! A regra da soma um caso especial da regra de Incluso-Excluso; ! Normalmente, os elementos dos conjuntos podem ser repetidos, e portanto, induzirem ao erro de serem contados mais de uma vez; ! |A U B| = |A| + |B| " |A ! B|; ! Outra tcnica poderosa estabelecer bijees
! Mapeamento um-para-um entre elementos de diferentes conjuntos.
10

Estratgias de Projeto de Algoritmos ! Existem diferentes maneiras de se projetar um algoritmo para soluo de um determinado problema combinatrio; ! Ao projetar um algoritmo, pensamos no problema e em suas caractersticas
! Que tipo de algoritmo teria melhor desempenho para este problema?

11

Estratgias de Projeto de Algoritmos ! Ao tratarmos de problemas difceis, como os NPCompletos, sabemos que no so conhecidas tcnicas eficientes para a sua resoluo
! Ento, podemos analisar as caractersticas da entrada para o problema para obter alguma vantagem no projeto de uma soluo?

12

TENTATIVA E ERRO

Tentativa e Erro
! Tentativa e Erro, Fora Bruta ou Busca Exaustiva a estratgia mais trivial e intuitiva para soluo de problemas ! Consiste em enumerar todas as combinaes possveis para uma soluo e avaliar se satisfazem ao problema

!! Escolhe a melhor das solues, ou seja, a soluo tima.


! Apesar de trivial em alguns casos, possui desempenho geralmente muito ruim.
14

Tentativa e Erro
! Consideremos o Problema da Mochila: ! Dada uma mochila com capacidade C, e n objetos com peso pi (i=1n), o objetivo preencher a mochila com o maior peso total, respeitando a capacidade C.

15

Tentativa e Erro
! Suponha uma mochila com capacidade de 15 kg e objetos de peso 12 kg, 2 kg, 4 kg e 8 kg; ! Este problema possui mais que uma soluo tima, ou seja, possui solues timas equivalentes:
! 12 kg + 2 kg; ! 8 kg + 2 kg + 4 kg.

! Solues viveis seriam, entre outras:


! 12 kg, 2 kg, 4 kg, 8 kg, 2kg + 4 kg, etc.

! Uma soluo invivel seria


! 12 kg + 4 kg.

16

Tentativa e Erro
! Um mtodo baseado em tentativa e erro testaria todas as combinaes entre elementos checando: ! Se a soluo vivel; ! Se a soluo possui valor melhor que outra encontrada anteriormente. ! Para determinar se uma soluo a melhor de todas desta forma, necessrio enumerar todas.

17

Tentativa e Erro
! Consideremos agora, o problema de decifrar uma senha que contm apenas nmeros: ! S existe uma soluo tima; ! No so consideradas solues parciais.

18

Tentativa e Erro
! Um mtodo baseado em tentativa e erro: ! Enumera todas as combinaes dos nmeros 0-9 para cada dgito da senha; ! Quanto maior a senha, pior o desempenho; ! Poderia ser utilizado um mtodo que levasse em considerao alguma estatstica sobre composio de senhas e dar prioridade s mais provveis.

19

Tentativa e Erro
! Dependendo da caracterstica do problema camos em uma das situaes para tentativa e erro: ! Gerar todas as Combinaes; ! Gerar todos os Arranjos; ! Gerar todas as Permutaes.

20

PERMUTAO, COMBINAO E ARRANJO

Permutao
! Dado um conjunto U com n elementos, uma permutao de seus elementos uma ordenao dos mesmos; ! A quantidade de permutaes possveis para n elementos definida pelo fatorial da cardinalidade do conjunto
! Ou seja n!; ! Que equivale a n!(n-1) !(n-2) !!1.

22

Permutao
! Por exemplo, o conjunto U={1, 2, 3} de cardinalidade 3, possui 6 permutaes:
! 1 2 3; ! 1 3 2; ! 2 1 3; ! 2 3 1; ! 3 1 2; ! 3 2 1.

23

Gerando Permutaes ! A gerao de todas as permutaes pode ser feita seguindo uma ordem lgica
! Estabelecendo uma relao entre uma permutao e a prxima; ! Desta forma, possvel numerar cada uma das permutaes dentro da sequncia gerada;

24

Gerando Permutaes ! Na linguagem C++ a funo next_permutation() gera permutaes de um vetor


! Em ordem lexicogrfica; !! A partir de uma permutao, gera a prxima em ordem lexicogrfica crescente e retorna true; !! Caso no haja tal permutao, gera a menor permutao em ordem lexicogrfica e retorna false; !! No gera permutaes de repeties.
25

Gerando Permutaes

26

Gerando Permutaes
! Como dito anteriormente, o nmero de permutaes fatorial no nmero de elementos
! O que significa crescimento muito rpido.

! Diferentes algoritmos de gerao de permutaes possuem velocidades diferentes


! Muito depende da complexidade da relao entre uma permutao e a prxima.

! Um algoritmo de bom desempenho o Algoritmo de Trotter-Johnson.

27

Gerando Permutaes
! O algoritmo Trotter-Johnson (ou SteinhausJohnson Trotter) gera permutaes de troca mnima:
! A partir de uma permutao, apenas dois elementos so trocados de lugar (i. e., transpostos) para gerar a prxima permutao.
1 2 3 1 3 2 3 1 2 3 2 1 2 3 1 2 1 3
28

Gerando Permutaes ! Curiosamente, Trotter (1962) e Johnson (1963) proporam o algoritmo e ambos levaram o crdito; ! Porm, Donald Knuth, no terceiro volume do The Art of Programming diz que nem um nem outro.
! Tocadores de sinos, segundo registrado por um livro antigo teriam desenvolvido o algoritmo.

29

Combinao
! Dado um conjunto U com n elementos, uma combinao sem repetio indica quantos subconjuntos diferentes de s elementos do conjunto U podem ser formados, no considerando a ordem dos elementos; ! Denotada por

n! C = s!(n ! s )!
n s

30

Combinao ! Por exemplo, o conjunto U = {A, B, C, D} possui 6 subconjuntos de dois elementos. So eles:
! AB, AC, AD, BC, BD, CD.

31

Arranjo
! Dado um conjunto U com n elementos, um arranjo simples indica quantas ordenaes dos elementos de U tomados r a r so possveis, em que se diferencia a ordem dos elementos, sem repeties; ! Denotada por

n! A = (n ! r )!
n r

32

Arranjo
! Dado um conjunto U com n elementos, um arranjo com repeties indica quantas ordenaes dos elementos de U tomados r a r so possveis, em que se diferencia a ordem dos elementos, com repeties; ! Denotada por

A =n

n r

33

Arranjo
! Por exemplo, o conjunto U = {A, B, C, D} possui 12 arranjos simples e 16 arranjos com repetio ! AB, AC, AD, BA, BC, BD, CA, CB, CD, DA, DB, DC; ! AA, AB, AC, AD, BA, BB, BC, BD, CA, CB, CC, CD, DA, DB, DC, DD.
34

Gerao de Subconjuntos ! Atravs de backtracking, possvel gerar todos os subconjuntos e tambm todas as permutaes; ! Tema de uma aula futura (ou do fim desta aula?)

35

RECURSIVIDADE

Recursividade ! Uma funo pode chamar quaisquer outras funes, inclusive a si mesma
! Uma funo que faz chamadas a si prpria dita recursiva.

! um conceito poderoso, pois define conjuntos infinitos com instrues finitas.

37

Recursividade
! Vantagem
! Reduo do tamanho do cdigo fonte.

! (Des)Vantagem
! 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.
38

Recursividade
! Usa-se uma pilha para armazenar os dados usados em cada chamada de uma funo que ainda 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.

39

Recursividade

40

Recursividade
! Por exemplo, consideremos a definio de uma funo que calcula o fatorial de um nmero n:

! No recursiva
!! n! = 1 !! n! = 1!2 !3 !4 ! !n para n=0; para n >= 1;

! Recursiva
!! n! = 1 !! n! = n !(n-1)! para n=0; para n >= 1.

41

Recursividade

42

Recursividade
! Primeira chamada

5*
43

Recursividade
! Segunda chamada

4* 5*
44

Recursividade
! Terceira chamada

3* 4* 5*
45

Recursividade
! Quarta chamada

2* 3* 4* 5*
46

Recursividade
! Quinta chamada 1 2* 3* 4* 5*
47

Recursividade
! Primeiro retorno 1 2* 3* 4* 5*
48

Recursividade
! Segundo retorno

2*1 3* 4* 5*
49

Recursividade
! Terceiro retorno

3*2 4* 5*
50

Recursividade
! Quarto retorno

4*6 5*
51

Recursividade
! Quinto e ltimo retorno ! Por fim, a funo retorna 120, o resultado de 5!

5*24
52

Recursividade
! O projeto de uma funo recursiva exige considerarmos duas partes cruciais: ! Critrio de parada; ! Operaes e chamada recursiva.

53

Recursividade
! Funes recursivas introduzem a possibilidade de Loop Infinito ! fundamental que a chamada recursiva a uma funo A esteja sujeita a uma condio C, a qual se torna satisfeita em algum momento da computao. ! Se no existisse a condio n=0, no exemplo anterior, quando a funo terminaria? ! Critrio de parada ! Faz com que o procedimento termine !!!

54

Recursividade

55

Recursividade
! Para projetar um algoritmo recursivo
! Defina pelo menos um caso bsico (condio de terminao); ! Quebre o problema em problemas menores, definindo o(s) caso(s) com recurso(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) bsico(s). ! Uma dica vlida o uso de variveis globais quando possvel, para evitar confuso na passagem de parmetros.

56

Recursividade
! Em comparao, verses iterativas so geralmente mais rpidas ! Porm, existem problemas inerentemente recursivos
! Percurso em rvores e grafos; ! Algoritmos de diviso e conquista.

! Em suma, a maioria dos algoritmos iterativos que usam pilhas tendem a ser modelados mais facilmente em verses recursivas; ! Erros de implementao geralmente acarretam em estouro de pilha.
57

Eis o poder da recurso


vetor = []! ! def comb(n,r):! global vetor ! if r > 0:! for i in range(n):! vetor.append(i)! comb(n,r-1)! vetor.pop()! else:! for v in vetor: print v,! print!

O que o cdigo acima (em python) faz?


58

Na prxima aula
! Diviso e Conquista.

59

Perguntas?

You might also like