mc3305 - algoritmos e estruturas de dados ii

61
1 Aula 03: Recursão / Recursividade BC1424 Algoritmos e Estruturas de Dados I Prof. Jesús P. Mena-Chalco 1Q-2016

Upload: haliem

Post on 23-Dec-2016

227 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: MC3305 - Algoritmos e Estruturas de Dados II

1

Aula 03:Recursão / Recursividade

BC1424Algoritmos e Estruturas de Dados I

Prof. Jesús P. Mena-Chalco

1Q-2016

Page 2: MC3305 - Algoritmos e Estruturas de Dados II

2

Sobre a Lista 01

Page 3: MC3305 - Algoritmos e Estruturas de Dados II

3

Lista 01

Solve me first Simple Array SumA Very Big SumDiagonal DifferencePlus Minus (opcional – bônus)

Data: 24/Fevereiro (quarta-feira) até às 23h50.Envio: Através do Tidia.

Arquivos:

Para cada exercício-problema deverá submeter:O código fonte: nome do arquivo → RA_nomeDoProblema.c

O comprovante de aceitação (screenshot) → RA_nomeDoProblema.pdf

Exemplo: 10123456_solveMeFirst.c 10123456_solveMeFirst.pdf

[Mensagem]Será utilizado um programade deteção de plágio em

todas as submissões!

Page 4: MC3305 - Algoritmos e Estruturas de Dados II

4

www.hackerrank.com

Page 5: MC3305 - Algoritmos e Estruturas de Dados II

5

Linguagem whitespace

Page 6: MC3305 - Algoritmos e Estruturas de Dados II

6

Recursão

Page 7: MC3305 - Algoritmos e Estruturas de Dados II

7

Anuncio de cacão com uma imagem recursiva.

Page 8: MC3305 - Algoritmos e Estruturas de Dados II

8

“To understand recursion, we must first understand recursion”

– folclore

“Ao tentar resolver o problema, encontrei obstáculos dentro de obstáculos.

Por isso, adotei uma solução recursiva”– um aluno

Page 9: MC3305 - Algoritmos e Estruturas de Dados II

9

Recursão

O conceito de recursão é de fundamental importância em computação!

Muitos problemas computacionais têm a seguinte propriedade:

Cada instância do problema contém uma instância menor do mesmo problema.→ Dizemos que esses problemas têm estrutura recursiva.

(*) Fonte: P. Feofiloff. Algoritmos em Linguagem C. 1ª Edição, Editora Campos, 2008.

Page 10: MC3305 - Algoritmos e Estruturas de Dados II

10

Recursão

Para resolver um tal problema é natural aplicar o seguinte método:

Se a instância em questão é pequena:→ Resolva-a diretamente

(use força bruta se necessário)

Senão→ Reduza-a a uma instância menor do mesmo problema→ Aplique o método à instância menor

e volte à instância original.

A aplicação do método produz um algoritmo recursivo.

(*) Fonte: P. Feofiloff. Algoritmos em Linguagem C. 1ª Edição, Editora Campos, 2008.

Page 11: MC3305 - Algoritmos e Estruturas de Dados II

A recursão pode ser infinita.Não esqueça de definir o caso base (condição de parada)https://www.youtube.com/watch?v=ANf0vsDHI4c

Fonte: http://en.wikipedia.org/wiki/Recursion

Page 12: MC3305 - Algoritmos e Estruturas de Dados II
Page 13: MC3305 - Algoritmos e Estruturas de Dados II

13

Fatorial de um número

Page 14: MC3305 - Algoritmos e Estruturas de Dados II

14

Fatorial de um número

Considere a função fatorial: fatorial = n! para um número inteiro não-negativo arbitrário

Page 15: MC3305 - Algoritmos e Estruturas de Dados II

15

Fatorial de um número

Page 16: MC3305 - Algoritmos e Estruturas de Dados II

16(*) Fonte: http://www.studytonight.com/c/datatype-in-c.php

Page 17: MC3305 - Algoritmos e Estruturas de Dados II

17

Fatorial de um número

Número de vezes em que a função F é chamada?

Page 18: MC3305 - Algoritmos e Estruturas de Dados II

18

Fatorial de um número

Número de vezes em que a função F é chamada? n

Page 19: MC3305 - Algoritmos e Estruturas de Dados II

19

Fatorial de um número

$ gcc fatorial.c ­o fatorial.exe

$ ./fatorial.exe 17355687428096000

$ ./fatorial.exe 186402373705728000

$ ./fatorial.exe 19121645100408832000

$ ./fatorial.exe 202432902008176640000

Page 20: MC3305 - Algoritmos e Estruturas de Dados II

20

Somatório de números

Page 21: MC3305 - Algoritmos e Estruturas de Dados II

21

Um exemplo de somatória

Dados dois número inteiros, n e k, crie uma função iterativa para calcular a seguinte somatória:

Page 22: MC3305 - Algoritmos e Estruturas de Dados II

22

Um exemplo de somatória

$ gcc somatoria.c ­lm ­o somatoria.exe$ ./somatoria.exe4201102999460754

Page 23: MC3305 - Algoritmos e Estruturas de Dados II

23

Um exemplo de somatória

Dados dois número inteiros, n e k, crie uma função iterativa para calcular a seguinte somatória:

Page 24: MC3305 - Algoritmos e Estruturas de Dados II

24

Um exemplo de somatória

Dados dois número inteiros, n e k, crie uma função iterativa para calcular a seguinte somatória:

Page 25: MC3305 - Algoritmos e Estruturas de Dados II

n=4, k=99

Page 26: MC3305 - Algoritmos e Estruturas de Dados II

n=3, k=99

n=4, k=99

4 +⁹⁹

Page 27: MC3305 - Algoritmos e Estruturas de Dados II

n=3, k=99

n=2, k=993 +⁹⁹

n=4, k=99

4 +⁹⁹

Page 28: MC3305 - Algoritmos e Estruturas de Dados II

n=3, k=99

n=2, k=993 +⁹⁹

n=1, k=992 +⁹⁹

n=4, k=99

4 +⁹⁹

Page 29: MC3305 - Algoritmos e Estruturas de Dados II

n=3, k=99

n=2, k=993 +⁹⁹

n=1, k=992 +⁹⁹

n=0, k=991 +⁹⁹

n=4, k=99

4 +⁹⁹

Page 30: MC3305 - Algoritmos e Estruturas de Dados II

n=3, k=99

n=2, k=993 +⁹⁹

n=1, k=992 +⁹⁹

01 +⁹⁹

n=4, k=99

4 +⁹⁹

Page 31: MC3305 - Algoritmos e Estruturas de Dados II

n=3, k=99

n=2, k=993 +⁹⁹

1 +0⁹⁹2 +⁹⁹

01 +⁹⁹

n=4, k=99

4 +⁹⁹

Page 32: MC3305 - Algoritmos e Estruturas de Dados II

n=3, k=99

2 +1 +0⁹⁹ ⁹⁹3 +⁹⁹

1 +0⁹⁹2 +⁹⁹

01 +⁹⁹

n=4, k=99

4 +⁹⁹

Page 33: MC3305 - Algoritmos e Estruturas de Dados II

3 +2 +1 +0⁹⁹ ⁹⁹ ⁹⁹

2 +1 +0⁹⁹ ⁹⁹3 +⁹⁹

1 +0⁹⁹2 +⁹⁹

01 +⁹⁹

n=4, k=99

4 +⁹⁹

Page 34: MC3305 - Algoritmos e Estruturas de Dados II

3 +2 +1 +0⁹⁹ ⁹⁹ ⁹⁹

2 +1 +0⁹⁹ ⁹⁹3 +⁹⁹

1 +0⁹⁹2 +⁹⁹

01 +⁹⁹

4 +3 +2 +1 +0⁹⁹ ⁹⁹ ⁹⁹ ⁹⁹

4 +⁹⁹

Page 35: MC3305 - Algoritmos e Estruturas de Dados II

3 +2 +1 +0⁹⁹ ⁹⁹ ⁹⁹

2 +1 +0⁹⁹ ⁹⁹3 +⁹⁹

1 +0⁹⁹2 +⁹⁹

01 +⁹⁹

4 +3 +2 +1 +0⁹⁹ ⁹⁹ ⁹⁹ ⁹⁹

4 +⁹⁹

Page 36: MC3305 - Algoritmos e Estruturas de Dados II

Um laço e um acumulador

Sem laço e sem acumulador?

Page 37: MC3305 - Algoritmos e Estruturas de Dados II

37

Função recursiva

Uma função recursiva é definida em seus próprios termos.

Toda função pode ser escrita como função recursiva sem o uso de interação (laços).

Reciprocamente, qualquer função recursiva pode ser descrita através de interações sucessivas.

Ingredientes:Definição de casos bases (que não envolvem recursão)Passos recursivos, com decremento na entrada, no sentido do caso base.

Page 38: MC3305 - Algoritmos e Estruturas de Dados II

38

Recursão

Para resolver um tal problema é natural aplicar o seguinte método:

Se a instância em questão é pequena:→ Resolva-a diretamente

(use força bruta se necessário)

Senão→ Reduza-a a uma instância menor do mesmo problema→ Aplique o método à instância menor

e volte à instância original.

A aplicação do método produz um algoritmo recursivo.

(*) Fonte: P. Feofiloff. Algoritmos em Linguagem C. 1ª Edição, Editora Campos, 2008.

Page 39: MC3305 - Algoritmos e Estruturas de Dados II

39

Números de Fibonacci

Page 40: MC3305 - Algoritmos e Estruturas de Dados II

40

Números de Fibonacci

(*) fonte http://britton.disted.camosun.bc.ca/fibslide/jbfibslide.htm

Page 41: MC3305 - Algoritmos e Estruturas de Dados II

41

Números de Fibonacci

Page 42: MC3305 - Algoritmos e Estruturas de Dados II

42

Números de Fibonacci

Função é duplamente recursiva (efetua mais de uma chamada a ela própria)

Page 43: MC3305 - Algoritmos e Estruturas de Dados II

43

Números de Fibonacci

Page 44: MC3305 - Algoritmos e Estruturas de Dados II

44

Números de Fibonacci

Fib (5) Fib (4) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (2) Fib (1) Fib (0) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1)

Pensou na eficiência da abordagem recursiva?

Page 45: MC3305 - Algoritmos e Estruturas de Dados II

45

Números de Fibonacci

Fib (6) Fib (5) Fib (4) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (2) Fib (1) Fib (0) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (4) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (2) Fib (1)

Fib (0)

Fib (7) Fib (6) Fib (5) Fib (4) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (2) Fib (1) Fib (0) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (4) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (2) Fib (1) Fib (0) Fib (5) Fib (4) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (2) Fib (1) Fib (0) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1)

Fib (8) Fib (7) Fib (6) Fib (5) Fib (4) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (2) Fib (1) Fib (0) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (4) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (2) Fib (1) Fib (0) Fib (5) Fib (4) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (2) Fib (1) Fib (0) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (6) Fib (5) Fib (4) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (2) Fib (1) Fib (0) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (4) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (2) Fib (1) Fib (0)

Fib (9) Fib (8) Fib (7) Fib (6) Fib (5) Fib (4) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (2) Fib (1) Fib (0) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (4) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (2) Fib (1) Fib (0) Fib (5) Fib (4) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (2) Fib (1) Fib (0) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (6) Fib (5) Fib (4) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (2) Fib (1) Fib (0) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (4) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (2) Fib (1) Fib (0) Fib (7) Fib (6) Fib (5) Fib (4) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (2) Fib (1) Fib (0) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (4) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (2) Fib (1) Fib (0) Fib (5) Fib (4) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1) Fib (2) Fib (1) Fib (0) Fib (3) Fib (2) Fib (1) Fib (0) Fib (1)

Page 46: MC3305 - Algoritmos e Estruturas de Dados II

46

Números de Fibonacci

n 10 20 30 50 100

Recursivo 8 ms 1 seg 2 min 21 dias 109 anos

Iterativo 1/6ms 1/3ms ½ ms ¾ ms 1,5 ms

Fonte: Brassard and Bradley (1996) apud ZIVIANI

Page 47: MC3305 - Algoritmos e Estruturas de Dados II

47

Números de Fibonacci

Os números de Fibonacci foram propostos por Leonardo di Pisa (Fibonacci), em 1202, como uma solução para o problema de determinar o tamanho da população de coelhos

(*) fonte http://www.oxfordmathcenter.com/drupal7/node/487

Page 48: MC3305 - Algoritmos e Estruturas de Dados II

48

Número de digitos binários

Page 49: MC3305 - Algoritmos e Estruturas de Dados II

49

Número de digitos binários

Crie uma função que calcula o número mínimo de digitos binários para representar um número inteiro decimal positivo n.

138 é representado com, no mínimo, 8 dígitos binários

Page 50: MC3305 - Algoritmos e Estruturas de Dados II

50

Número de digitos binários

Page 51: MC3305 - Algoritmos e Estruturas de Dados II

51

Número de digitos binários

Número de vezes em que a função bin é chamada?

Page 52: MC3305 - Algoritmos e Estruturas de Dados II

52

Número de digitos binários

Número de vezes em que a função bin é chamada? floor(log2(n))

Page 53: MC3305 - Algoritmos e Estruturas de Dados II

53

Recursividade é uma das coisas mágicas e interessantes em Programação.

Page 54: MC3305 - Algoritmos e Estruturas de Dados II

54

Atividade em aula

Page 55: MC3305 - Algoritmos e Estruturas de Dados II

55

Atividade 1

Qual é o resultado da execução das seguintes funções para n=5?

Resposta de conta1 para n=554321

Resposta de conta2 para n=512345

Page 56: MC3305 - Algoritmos e Estruturas de Dados II

56

Atividade 2

Indique o que devolvem as funções F1 e F2 para valores de: a=2, k=5.Construa sua representação matemática recursiva.Descreva em português o que calcula cada função.

Ambas as funções calculam a^k .Para a=2, e b=5 a funçãodevolve 32.

F2 é mais eficiente!

Page 57: MC3305 - Algoritmos e Estruturas de Dados II

57

Atividade 3

Descreva em português o que calcula a função M.Qual o número total de comparações?Bônus: Escreva uma versão iterativa da função M.

A função M, dada um vetor v[0,…,n-1] de n elementos devolve o menor valor contido em v.

Número de comparações = n

Page 58: MC3305 - Algoritmos e Estruturas de Dados II

58

Exercício 03: Função M

Versão iterativa

Page 59: MC3305 - Algoritmos e Estruturas de Dados II

59

Recursão

Uma função recursiva é aquela que se chama a si mesma (obrigatoriamente)?

Page 60: MC3305 - Algoritmos e Estruturas de Dados II

60

Recursão

Uma função recursiva não necessariamente é aquela que se chama a si mesma

Page 61: MC3305 - Algoritmos e Estruturas de Dados II

61

Análise de algoritmos recursivos

Para fazer a análise é necessário obter a relação de recorrência.A fórmula fechada (resolução) da recorrência pode ser obtida por diferentes abordagens, por exemplo:

Árvore de recorrênciaMétodo mestreFunções geradoras