bcc402 algoritmos e programação avançada• curiosamente, este algoritmo foi proposto...

58
BCC402 Algoritmos e Programação Avançada Prof. Marco Antonio M. Carvalho Prof. Túlio Ângelo M. Toffolo 2011/1

Upload: others

Post on 14-Mar-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

BCC402 Algoritmos e Programação AvançadaProf. Marco Antonio M. CarvalhoProf. Túlio Ângelo M. Toffolo2011/1

Page 2: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

2

Na aula anterior

• Prova

Page 3: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

3

Na aula de hoje

• Técnicas básicas de contagem;• Tentativa e Erro;• Recursividade.

Page 4: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

4

Problemas Combinatórios

• Combinatória é a matemática do contar– Existem diversos problemas básicos de contagem que

ocorrem repetidamente em ciência da computação e em programação.

• Problemas Combinatórios são aqueles em que uma solução é a combinação de um subconjunto de elementos– São famosos por sua relação com a “esperteza” e

insights;– Uma vez que se coloca o problema sob a perspectiva

certa, a solução pode se tornar óbvia.

Page 5: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

5

Problemas Combinatórios

• O espaço de busca de um problema combinatório é o conjunto de todas as soluções possíveis, podendo ser restrito as soluções viáveis ou não;

• Uma solução viável é uma solução completa, que atende aos requisitos do problema;

• Uma solução inviável é uma solução incompleta ou mesmo uma solução nula.

Page 6: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

6

Problemas Combinatórios

• Ainda, podemos ter soluções equivalentes, ou seja, mais de uma solução viável par ao mesmo problema;

• Alguns problemas possuem apenas uma solução melhor que todas as outras, chamada de solução ótima.

Page 7: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

7

Técnicas Básicas de Contagem

• Basicamente, existem três regras básicas de contagem a partir das quais várias formas de contagem são geradas:– Regra da Soma;– Regra do Produto;– Regra de Inclusão-Exclusão.

Page 8: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

8

Técnicas Básicas de Contagem

• Regra da Soma: – Se há |A| possibilidades em um conjunto A e |B|

possibilidades em um conjunto B, então há |A|+|B| possibilidades de A ou B ocorrerem, assumindo que os conjuntos possuem elementos distintos.

Page 9: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

9

Técnicas Básicas de Contagem

• Regra do Produto: – Se há |A| possibilidades em um conjunto A e |B|

possibilidades em um conjunto B, então há |A| |B| formas de combinar um elemento de Acom um elemento de B.

Page 10: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

10

Técnicas Básicas de Contagem

• Regra da Inclusão-Exclusão: – A regra da soma é um caso especial da regra de

Inclusão-Exclusão;– 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 técnica poderosa é estabelecer bijeções– Ou seja, um mapeamento um para um entre

elementos de diferentes conjuntos.

Page 11: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

11

Estratégias de Projeto de Algoritmos

• Existem diferentes maneiras de se projetar um algoritmo para solução de um determinado problema combinatório;

• Ao projetar um algoritmo, pensamos no problema e em suas características– Que tipo de algoritmo teria melhor desempenho

para este problema?

Page 12: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

12

Estratégias de Projeto de Algoritmos

• Ao tratarmos de problemas difíceis, como os NP-Completos, sabemos que não são conhecidas técnicas eficientes para a sua resolução– Então, podemos analisar as características da

entrada para o problema para obter alguma vantagem no projeto de uma solução?

Page 13: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

13

Tentativa e Erro

• Tentativa e Erro, Força Bruta ou Busca Exaustiva é a estratégia mais trivial e intuitiva para solução de problemas– Consiste em enumerar todas as combinações

possíveis para uma solução e avaliar se satisfazem ao problema• Escolhe a melhor das soluções, ou solução

ótima.

– Apesar de trivial, possui desempenho muito ruim.

Page 14: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

14

Tentativa e Erro

• Consideremos o Problema da Mochila:– Dada uma mochila com capacidade C, e n

objetos com peso pi (i=1…n), o objetivo é preencher a mochila com o maior peso total, respeitando a capacidade C.

Page 15: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

15

Tentativa e Erro

• Suponha uma mochila de capacidade 15 kg e objetos de peso 12 kg, 2 kg, 4 kg e 8 kg;

• Este problema possui mais que uma solução ótima, ou seja, possui soluções ótimas equivalentes:– 12 kg + 2 kg;– 8 kg + 2 kg + 4 kg.

• Soluções viáveis seriam, entre outras:– 12 kg, 2 kg, 4 kg, 8 kg, 2kg + 4 kg, etc.

• Uma solução inviável seria– 12 kg + 4 kg.

Page 16: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

16

Tentativa e Erro

• Um método baseado em tentativa e erro testaria todas as combinações entre elementos checando:– Se a solução é viável;– Se a solução possui valor melhor que outra

encontrada anteriormente.

• Para determinar se uma solução é a melhor de todas desta forma, é necessário enumerartodas.

Page 17: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

17

Tentativa e Erro

• Consideremos agora, o problema decifrar uma senha que contém apenas números:– Só existe uma solução ótima;– Não são consideradas soluções parciais.

Page 18: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

18

Tentativa e Erro

• Um método baseado em tentativa e erro:– Enumera todas as combinações dos números 0-9

para cada dígito da senha;– Quanto maior a senha, pior o desempenho;– Poderia ser utilizado um método que levasse em

consideração alguma estatística sobre composição de senhas e dar prioridade às mais prováveis.

Page 19: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

19

Tentativa e Erro

• Dependendo da característica do problema caímos em uma das situações para tentativa e erro:– Gerar todas as Combinações;– Gerar todos os Arranjos;– Gerar todas as Permutações.

Page 20: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

20

Permutação

• Dado um conjunto U com n elementos, uma permutação de seus elementos é uma ordenação dos mesmos;

• A quantidade de permutações possíveis para n elementos é definida pelo fatorial da cardinalidade do conjunto– Ou seja n!;– Que equivale a n (n-1) (n-2) … 1.

Page 21: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

21

Permutação

• Por exemplo, o conjunto U={1, 2, 3} de cardinalidade 3, possui 6 permutações:– 1 2 3;– 1 3 2;– 2 1 3;– 2 3 1;– 3 1 2;– 3 2 1.

Page 22: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

22

Gerando Permutações

• A geração de todas as permutações pode ser feita seguindo uma ordem lógica– Estabelecendo uma relação entre uma

permutação e a próxima;– Desta forma, é possível numerar cada uma das

permutações dentro da sequência gerada;• Dada uma determinada posição dentro da sequência

de todas permutações, é possível determinar qual é a permutação correspondente (rank);

• Ainda, dada uma permutação, é possível determinar qual é sua posição (número) dentro da sequência de todas as permutações (unrank).

Page 23: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

23

Gerando Permutações

• Na linguagem C++ a função next_permutation() gera permutações de um vetor– Em ordem lexicográfica;

• A partir de uma permutação, gera a próxima em ordem lexicográfica crescente e true;

• Caso não haja tal permutação, gera a menor permutação em ordem lexicográfica e false;

• Não gera permutações de repetições.

Page 24: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

24

Gerando Permutações

Page 25: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

25

Gerando Permutações

• Como dito anteriormente, o número de permutações é fatorial no número de elementos– O que significa crescimento muito rápido.

• Diferentes algoritmos de geração de permutações possuem velocidades diferentes– Muito depende da complexidade da relação entre

uma permutação e a próxima.

• Um algoritmo de bom desempenho é o Trotter-

Johnson.

Page 26: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

26

Gerando Permutações

• O algoritmo Trotter-Johnson (ou Steinhaus–Johnson–

Trotter) gera permutações de troca mínima:– A partir de uma permutação, apenas dois elementos são

trocados de lugar (i. e., transpostos) para gerar a próxima permutação.

1 2 31 3 23 1 23 2 12 3 12 1 3

Page 27: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

27

Gerando Permutações

• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito;

• Porém, 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.

Page 28: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

28

Gerando Permutações

• O código do algoritmo Trotter-Johnson está disponível no Moodle

– Além dele, o algoritmo de Dijkstra para geração de permutações em ordem lexicográfica e sem repetições também está disponível.

Page 29: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

29

Combinação

• Dado um conjunto U com n elementos, uma combinação sem repetição indica quantos subconjuntos diferentes de s elementos do conjunto U podem ser formados, não considerando a ordem dos elementos;

• Denotada por )!(!

!

sns

nC

n

s

=

Page 30: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

30

Combinação

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

Page 31: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

31

Arranjo

• Dado um conjunto U com n elementos, um arranjo simples indica quantas ordenações de dos elementos de U tomados r a r são possíveis, em que se diferencia a ordem dos elementos, sem repetições;

• Denotada por )!(

!

rn

nA

n

r

=

Page 32: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

32

Arranjo

• Dado um conjunto U com n elementos, um arranjo com repetições indica quantas ordenações de dos elementos de U tomados r a r são possíveis, em que se diferencia a ordem dos elementos, com repetições;

• Denotada por rn

rnA =

Page 33: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

33

Arranjo

• Por exemplo, o conjunto U = {A, B, C, D} possui 12 arranjos simples e 16 arranjos com repetição– 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.

Page 34: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

34

Geração de Subconjuntos

• Através de backtracking, é possível gerar todos os subconjuntos e também todas as permutações;

• Tema de uma aula futura.

Page 35: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

35

Recursividade

• Uma função pode chamar quaisquer outras funções, inclusive a si mesma– Uma função que faz chamadas a si própria é dita

recursiva.

• É um conceito poderoso, pois define conjuntos infinitos com instruções finitas.

Page 36: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

36

Recursividade

• Vantagem– Redução do tamanho do código fonte.

• (Des)Vantagem– 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.

Page 37: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

37

Recursividade

• Usa-se uma pilha para armazenar os dados usados em cada chamada de uma função que ainda 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.

Page 38: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

38

Recursividade

Page 39: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

39

Recursividade

• Por exemplo, consideremos a definição de uma função que calcula o fatorial de um número n:

• Não recursiva– n! = 1 para n=0;– n! = 1 2 3 4 … n para n >= 1;

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

Page 40: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

40

Recursividade

Page 41: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

41

Recursividade

• Primeira chamada.

5*

Page 42: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

42

Recursividade

• Segunda chamada.

4*

5*

Page 43: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

43

Recursividade

• Terceira chamada. 3*

4*

5*

Page 44: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

44

Recursividade

• Quarta chamada.

2*

3*

4*

5*

Page 45: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

45

Recursividade

• Quinta chamada.

1

2*

3*

4*

5*

Page 46: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

46

Recursividade

• Primeiro retorno.

2*1

3*

4*

5*

Page 47: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

47

Recursividade

• Segundo retorno. 3*2

4*

5*

Page 48: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

48

Recursividade

• Terceiro retorno.

4*6

5*

Page 49: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

49

Recursividade

• Quarto retorno.

5*24

Page 50: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

50

Recursividade

• Por fim, a função retorna 120, o fatorial de 5.

Page 51: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

51

Recursividade

• O projeto de uma função recursiva exige considerarmos duas partes cruciais:– Condição de terminação;– Operações e chamada recursiva.

Page 52: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

52

Recursividade

• Funções recursivas introduzem a possibilidade de Loop Infinito

– É fundamental que a chamada recursiva a uma função Aesteja sujeita a uma condição C, a qual se torna satisfeita em algum momento da computação.

– Se não existisse a condição n=0, no exemplo anterior, quando a função terminaria?

• Condição de terminação– Permite que o procedimento deixe de ser executado– O procedimento deve ter pelo menos um caso básico para

cada caso recursivo, o que significa a finalização da função.

Page 53: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

53

Recursividade

Page 54: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

54

Recursividade

• Para projetar 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).

• Uma dica válida é o uso de variáveis globais quando possível, para evitar confusão na passagem de parâmetros.

Page 55: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

55

Recursividade

• Em comparação, versões iterativas são mais rápidas, pois na versão recursiva, a troca de contextos a cada chamada acaba gastando mais tempo;

• Porém, existem problemas inerentemente recursivos– Percurso em árvores e grafos;– Algoritmos de divisão e conquista.

• Em suma, a maioria dos algoritmos iterativos que usam pilhas tendem a ser modelados mais facilmente em versões recursivas;

• Erros de implementação geralmente acarretam em estouro de pilha.

Page 56: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

56

Perguntas?

Page 57: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

57

Na próxima aula

• Divisão e Conquista.

Page 58: BCC402 Algoritmos e Programação Avançada• Curiosamente, este algoritmo foi proposto independentemente por Trotter (1962) e Johnson (1963), mas ambos levaram o crédito; • Porém,

58

FIM