• Nenhum resultado encontrado

Outline. 19. Recursividade. Matemática. DIM Exemplos clássicos

N/A
N/A
Protected

Academic year: 2021

Share "Outline. 19. Recursividade. Matemática. DIM Exemplos clássicos"

Copied!
14
0
0

Texto

(1)

19. Recursividade

DIM0321 2015.1 DIM0321 19. Recursividade 2015.1 1 / 53

Outline

1 Recursão 2 Exemplos clássicos 3 Torre de Hanoi DIM0321 19. Recursividade 2015.1 2 / 53 1 Recursão 2 Exemplos clássicos 3 Torre de Hanoi DIM0321 19. Recursividade 2015.1 3 / 53

Matemática

Definir um problem recursivamente = resolver o problema a partir da solução de uma instância menor do problema.

n! = (

1 se n = 0

n∗ (n − 1)! senão

(2)

Em programação

Uma forma de especificar uma função (sub-rotina) que é definida através de sua própria definição.

fib(n) = (

x x≤ 1

fib(n− 1) + fib(n − 2) n ≥ 1

A recursão pode ser usada também como procedimento ou mecanismo de alteração de dados. DIM0321 19. Recursividade 2015.1 5 / 53 1 Recursão 2 Exemplos clássicos 3 Torre de Hanoi DIM0321 19. Recursividade 2015.1 6 / 53

Fatorial

1 #include <stdio.h> 2 #include <assert.h>

3 unsignedfact(unsignedn)

4 { 5 if (n == 0) return 1; 6 return n * fact(n - 1); 7 } 8 9

10 int main(void)

11 {

12 unsigned n;

13 scanf("%u", &n);

14 printf("fact(%u) = %u\n", n, fact(n));

15 return 0;

16 }

Sequência de Fibonacci

1 #include <stdio.h>

2 #include <assert.h>

3 unsignedfib(unsigned n)

4 {

5 if (n == 0) return 0;

6 else if (n == 1) return 1;

7 else return fib(n - 1) + fib(n - 2);

8 }

9 10

11 int main(void)

12 {

13 unsigned n;

14 scanf("%u", &n);

15 printf("fib(%u) = %u\n", n, fib(n));

16 return 0;

(3)

Ordenação

Problema

Dado um conjunto A = {a1, a2, a3,· · · , an}, ordenar A tal que para

1 ≤ i < n, ai < ai+1

Ideia

Se {a2,· · · , an} estiver ordenado basta inserir a1 na sua posição ordenada em

{a2,· · · , an}

Se {a2,· · · , an} não estiver ordenado, aplica o mesmo princípio (mas o

problema está menor)

Um conjunto com apenas 1 elemento está obrigatoriamente ordenado

DIM0321 19. Recursividade 2015.1 9 / 53

Parada

A execução de uma função recursiva provoca a chamada a própria função Quando parar?

A base!

Definir e não esquecer ocaso base

1 O corpo da função deve incluir ao menos um caso onde o valor de retorno não depende de uma chamada recursiva. Este é ocaso base.

2 Se o cálculo de f(a) chama recursivamente f(b), então b tem que estar mais próximo do caso-base do que a

DIM0321 19. Recursividade 2015.1 10 / 53

Recursão mútua

1 #include <stdbool.h> 2 #include <assert.h> 3 #include <stdio.h> 4

5 bool even(unsigned n);

6 bool odd(unsigned n);

7

8 bool even(unsigned n)

9 {

10 printf("even %d\n", n);

11 if (n == 0) return true;

12 else return odd(n - 1);

13 }

14 15

16 bool odd(unsigned n)

17 {

18 printf("odd %d\n", n);

19 if (n == 0) return false;

20 else return even(n - 1);

21 }

22

23 int main(void)

24 { 25 int n; 26 scanf("%d", &n); 27 if (n < 0) { 28 n = -n; 29 } 30 31 if (even(n)) { 32 assert(!odd(n)); 33 printf("%d is even\n", n); 34 } 35 else { 36 assert (odd(n)); 37 printf("%d is odd\n", n); 38 } 39 40 return 0; 41 } DIM0321 19. Recursividade 2015.1 11 / 53 1 Recursão 2 Exemplos clássicos 3 Torre de Hanoi DIM0321 19. Recursividade 2015.1 12 / 53

(4)

Torre de Hanoi – 1 disco

1

DIM0321 19. Recursividade 2015.1 13 / 53

Torre de Hanoi – 1 disco

1 Mudei disco do pino 1 ao pino 3.

DIM0321 19. Recursividade 2015.1 14 / 53

Torre de Hanoi – 1 disco

1

OK

Torre de Hanoi – 2 discos

2 1

(5)

Torre de Hanoi – 2 discos

2 1

Mudei disco do pino 1 ao pino 2.

DIM0321 19. Recursividade 2015.1 17 / 53

Torre de Hanoi – 2 discos

1 2

Mudei disco do pino 1 ao pino 3.

DIM0321 19. Recursividade 2015.1 18 / 53

Torre de Hanoi – 2 discos

2 1

Mudei disco do pino 2 ao pino 3.

DIM0321 19. Recursividade 2015.1 19 / 53

Torre de Hanoi – 2 discos

2 1

OK

(6)

Torre de Hanoi – 3 discos

3 2 1

DIM0321 19. Recursividade 2015.1 21 / 53

Torre de Hanoi – 3 discos

3 2

1 Mudei disco do pino 1 ao pino 3.

DIM0321 19. Recursividade 2015.1 22 / 53

Torre de Hanoi – 3 discos

3 2 1

Mudei disco do pino 1 ao pino 2.

Torre de Hanoi – 3 discos

3 2

1

(7)

Torre de Hanoi – 3 discos

2 1

3 Mudei disco do pino 1 ao pino 3.

DIM0321 19. Recursividade 2015.1 25 / 53

Torre de Hanoi – 3 discos

1 2 3

Mudei disco do pino 2 ao pino 1.

DIM0321 19. Recursividade 2015.1 26 / 53

Torre de Hanoi – 3 discos

1 3

2

Mudei disco do pino 2 ao pino 3.

DIM0321 19. Recursividade 2015.1 27 / 53

Torre de Hanoi – 3 discos

3 2 1

Mudei disco do pino 1 ao pino 3.

(8)

Torre de Hanoi – 3 discos

3 2 1

OK

DIM0321 19. Recursividade 2015.1 29 / 53

Torre de Hanoi – 4 discos

4 3 2 1

DIM0321 19. Recursividade 2015.1 30 / 53

Torre de Hanoi – 4 discos

4 3 2

1

Mudei disco do pino 1 ao pino 2.

Torre de Hanoi – 4 discos

4 3

1 2

(9)

Torre de Hanoi – 4 discos

4 3

2 1

Mudei disco do pino 2 ao pino 3.

DIM0321 19. Recursividade 2015.1 33 / 53

Torre de Hanoi – 4 discos

4 3 2

1

Mudei disco do pino 1 ao pino 2.

DIM0321 19. Recursividade 2015.1 34 / 53

Torre de Hanoi – 4 discos

4 1

3 2

Mudei disco do pino 3 ao pino 1.

DIM0321 19. Recursividade 2015.1 35 / 53

Torre de Hanoi – 4 discos

4 1

3 2

Mudei disco do pino 3 ao pino 2.

(10)

Torre de Hanoi – 4 discos

4 3

2 1

Mudei disco do pino 1 ao pino 2.

DIM0321 19. Recursividade 2015.1 37 / 53

Torre de Hanoi – 4 discos

3 2 1

4 Mudei disco do pino 1 ao pino 3.

DIM0321 19. Recursividade 2015.1 38 / 53

Torre de Hanoi – 4 discos

3 2

4 1

Mudei disco do pino 2 ao pino 3.

Torre de Hanoi – 4 discos

2 3 4

1

(11)

Torre de Hanoi – 4 discos

2 1

3 4

Mudei disco do pino 3 ao pino 1.

DIM0321 19. Recursividade 2015.1 41 / 53

Torre de Hanoi – 4 discos

2 1

4 3

Mudei disco do pino 2 ao pino 3.

DIM0321 19. Recursividade 2015.1 42 / 53

Torre de Hanoi – 4 discos

2 1 4

3

Mudei disco do pino 1 ao pino 2.

DIM0321 19. Recursividade 2015.1 43 / 53

Torre de Hanoi – 4 discos

1 4

3 2

Mudei disco do pino 1 ao pino 3.

(12)

Torre de Hanoi – 4 discos

4 3 2 1

Mudei disco do pino 2 ao pino 3.

DIM0321 19. Recursividade 2015.1 45 / 53

Torre de Hanoi – 4 discos

4 3 2 1

OK

DIM0321 19. Recursividade 2015.1 46 / 53

Tower of Hanoi – 5 Disc

5 4 3 2 1

?

História

Proposto pelo matemático Édouard Lucas em 1883.

Assunto

Considerando uma torre de n discos de circunferência crescente, inicialmente empilhados em ordem crescente de circunferência sobre uma entre três varas. O objetivo é transferir a torre inteira para outra vara, movendo apenas um disco de cada vez, e nunca colocando um disco maior sobre um menor.

(13)

Resolução programática

Definir uma sub-rotina que imprime as instruções para resolver o quebra-cabeça: Ter como parâmetro o número de discos

Imprimir uma lista de movimentos: “mover X para Y” onde 1 ≤ X , Y ≤ 3.

Exemplo, para 2 discos:

mover 1 para 2 mover 1 para 3 mover 2 para 3 DIM0321 19. Recursividade 2015.1 49 / 53

Solução recursiva

1 #include <stdio.h> 2 #include <assert.h> 3

4 int nmoves; // Init = 0;

5

6 void move_disc(char orig, char dest)

7 {

8 nmoves++;

9 printf("%d: moving %c -> %c\n", nmoves, orig, dest);

10 }

11

12 void move(int n, char orig, char dest, char aux)

13 {

14 if (n == 1) move_disc(orig, dest);

15 else {

16 move(n - 1, orig, aux, dest);

17 move_disc(orig, dest);

18 move(n - 1, aux, dest, orig);

19 }

20 21 }

22

23 int main(void)

24 {

25 int n;

26 printf("Tower of Hanoi\n");

27 printf("How many discs ( > 0)? ");

28 scanf("%d", &n);

29 assert(n > 0);

30 nmoves = 0;

31 move(n, ’a’, ’b’, ’c’);

32 printf("Moves done : %d\n", nmoves);

33 return 0;

34 }

DIM0321 19. Recursividade 2015.1 50 / 53

Soluçao imperativa

Para mais tarde !

DIM0321 19. Recursividade 2015.1 51 / 53

Referências

Precisões

[?] 5.1 – 5.4 [?] 10 DIM0321 19. Recursividade 2015.1 52 / 53

(14)

Perguntas ?

http://dimap.ufrn.br/~richard/dim0321

Referências

Documentos relacionados

utilizadores para os possíveis perigos de usar este produto para outros fins que não sejam aqueles para o qual ele se destina. As informações dadas estão conforme as

Para identificar quais treinamentos serão necessários para cada trabalhador ou equipe dentro de uma organização desenvolver um programa eficaz de T&amp;D, pode-se buscar

Escrever uma função recursiva que calcula o quociente da divisão euclidiana (inteira) de um inteiro positivo por um outro, sem usar

De acordo com Candido e Abreu (2004) essa dimensão subdivide-se em dez: I) interação entre os diversos agentes envolvidos; II) planejamento e Coordenação das

Ao retornar ao porto principal, nos esperarão os ônibus que nos levarão até Capri capital, onde com nosso guia realizaremos um fantástico passeio pelas estreitas e românticas

É perceptível, desta forma, o constante aumento do aprofundamento dos personagens: os “príncipes” têm agora não só nome e falas, mas personalidades bem desenvolvidas,

Caso o Investidor opte por indicar o número de Unidades de Conta, o montante a resgatar em cada Fundo Autónomo será igual ao valor que resultar da multiplicação entre o número

Gabinetes Modelo : BP1009 Small Form Factor (SFF) ou SLIM Desk (Y7301) disponíveis nas cores Preto/Prata, Preto, ou Cool Gray; Opção para Tool-Free (não requer uso de