recursão. uma função é dita recursiva quando dentro do seu código existe uma chamada para si...

67
Recursão

Upload: internet

Post on 18-Apr-2015

140 views

Category:

Documents


9 download

TRANSCRIPT

Page 2: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

Recursão

Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma

ExemploCálculo do fatorial de um número:

𝑓 𝑎𝑡𝑜𝑟𝑖𝑎𝑙 (𝑛)={ 1𝑠𝑒𝑛=0𝑛∗ 𝑓𝑎𝑡𝑜𝑟𝑖𝑎𝑙 (𝑛−1 )𝑠𝑒𝑛>1

Page 3: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

Fatorial

𝑓 𝑎𝑡𝑜𝑟𝑖𝑎𝑙 (𝑛)={ 1𝑠𝑒𝑛=0𝑛∗ 𝑓𝑎𝑡𝑜𝑟𝑖𝑎𝑙 (𝑛−1 )𝑠𝑒𝑛>0

0! = 11! = 1 * 12! = 2 * 13! = 3 * 2 * 14! = 4 * 3 * 2 * 15! = 5 * 4 * 3 * 2 * 1 Função Iterativa

Função Iterativa

Page 4: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

Fatorial

𝑓 𝑎𝑡𝑜𝑟𝑖𝑎𝑙 (𝑛)={ 1𝑠𝑒𝑛=0𝑛∗ 𝑓𝑎𝑡𝑜𝑟𝑖𝑎𝑙 (𝑛−1 )𝑠𝑒𝑛>0

0! = 11! = 1 * 12! = 2 * 13! = 3 * 2 * 14! = 4 * 3 * 2 * 15! = 5 * 4 * 3 * 2 * 1

0! = 11! = 1 * 0!2! = 2 * 1!3! = 3 * 2!4! = 4 * 3!5! = 5 * 4!

Page 5: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

Fatorial1 5! = 5 * 4!2 4! = 4 * 3!3 3! = 3 * 2!4 2! = 2 * 1!5 1! = 1 * 0!6 0! = 1

6’ 0! = 15’ 1! = 1 * 0! = 1 * 1 = 1 4’ 2! = 2 * 1! = 2 * 1 = 23’ 3! = 3 * 2! = 3 * 2 = 62’ 4! = 4 * 3! = 4 * 6 = 241’ 5! = 5 * 4! = 5 * 24 = 120

Page 6: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

Fatorial1 5! = 5 * 4!2 4! = 4 * 3!3 3! = 3 * 2!4 2! = 2 * 1!5 1! = 1 * 0!6 0! = 1

120

Page 7: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

Fatorial

𝑓 𝑎𝑡𝑜𝑟𝑖𝑎𝑙 (𝑛)={ 1𝑠𝑒𝑛=0𝑛∗ 𝑓𝑎𝑡𝑜𝑟𝑖𝑎𝑙 (𝑛−1 )𝑠𝑒𝑛>0

0! = 11! = 1 * 0!2! = 2 * 1!3! = 3 * 2!4! = 4 * 3!5! = 5 * 4!

Função RecursivaFunção Recursiva

Page 8: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

Recursão e a Pilha de Execução (stack)

Supõe que façamos• int x = fatorial(4);

X

Função Recursiva

Page 9: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

4

Recursão e a Pilha de Execução (stack)

fatorial(4)

XRetorno

n

Page 10: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

4

Recursão e a Pilha de Execução (stack)

fatorial(4)

XRetorno

n

fatorial(3)

3

Retorno

n

Page 11: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

4

Recursão e a Pilha de Execução (stack)

fatorial(4)

XRetorno

n

fatorial(3)

3

Retorno

n

fatorial(2)2

Retorno

n

Page 12: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

4

Recursão e a Pilha de Execução (stack)

fatorial(4)

XRetorno

n

fatorial(3)

3

Retorno

n

fatorial(2)2

Retorno

nfatorial(1)

1

Retorno

n

Page 13: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

4

Recursão e a Pilha de Execução (stack)

fatorial(4)

XRetorno

n

fatorial(3)

3

Retorno

n

fatorial(2)2

Retorno

nfatorial(1)

1

Retorno

n

fatorial(0)

0

Retorno

n

Page 14: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

4

Recursão e a Pilha de Execução (stack)

fatorial(4)

XRetorno

n

fatorial(3)

3

Retorno

n

fatorial(2)2

Retorno

nfatorial(1)

1

Retorno

n1Retorno

Page 15: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

4

Recursão e a Pilha de Execução (stack)

fatorial(4)

XRetorno

n

fatorial(3)

3

Retorno

n

fatorial(2)2

Retorno

n1Retorno

Page 16: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

4

Recursão e a Pilha de Execução (stack)

fatorial(4)

XRetorno

n

fatorial(3)

3

Retorno

n

2Retorno

Page 17: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

4

Recursão e a Pilha de Execução (stack)

fatorial(4)

XRetorno

n

6Retorno

Page 18: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

24

Recursão e a Pilha de Execução (stack)

XRetorno

int x = fatorial(4);

Page 19: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

Recursão e a Pilha de Execução (stack)

X

int x = fatorial(4);

24

Page 20: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

Elementos de uma função recursiva

• Condição de parada ou caso base ou caso trivial:• É a parte da definição da função que não faz chamada recursiva

• Chamada recursiva propriamente dita ou passo de recursão: • Deve resolver uma instância menor do mesmo problema

• Processamento de apoio ou processamento complementar: • Demais processamentos que acompanham e/ou utilizam o que resulta

da chamada recursiva

Page 21: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

Elementos de uma função recursiva

Exemplo:

Função Recursiva

Page 22: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

Função Recursiva

Elementos de uma função recursiva

Exemplo: Condição de Parada

Page 23: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

Função Recursiva

Elementos de uma função recursiva

Exemplo: Chamada recursiva a uma instância menor

Page 24: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

Função Recursiva

Elementos de uma função recursiva

Exemplo: Processamento de apoio

Page 25: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

Importante

• Se não existir o caso base (condição de parada), o programa entra em loop infinito

• Se a chamada recursiva não for aplicada a uma instância menor do problema, o programa entra em um loop infinito

• Se um função recursiva ficar chamando a si mesma indefinidamente (num loop infinito) o programa rapidamente para por “estouro da pilha” (stack overflow)

Page 26: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

Importante

• Se não existir o caso base (condição de parada), o programa entra em loop infinito

• Se a chamada recursiva não for aplicada a uma instância menor do problema, o programa entra em um loop infinito

• Se um função recursiva ficar chamando a si mesma indefinidamente (num loop infinito) o programa rapidamente para por “estouro da pilha” (stack overflow)

Page 27: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

Fibonacci• O número de Fibonacci Fn para n>=0 é definido da seguinte maneira:

Função Recursiva

Exercício 01

Page 28: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

Exercício 2

O que faz o programa abaixo? Justifique!

Page 29: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

Torre de Hanói• A lenda diz que num templo perdido na Ásia uns monges estão

tentando mover 64 discos de tamanhos diferentes de um pino para outro, usando um terceiro como auxiliar, de tal forma que:• Nunca um disco maior é colocado sobre um menor

• De acordo com a lenda o mundo se acaba no momento que esta tarefa é completada.

Page 30: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

Torre de Hanói• Estado inicial: • pilha de discos ordenados pelo raio

• Objetivo: • transferir a pilha de discos para uma das outras pilhas vazias

• Restrição:• Mover um disco por vez• Um disco de raio maior não pode estar sobre um disco de raio menor

Page 31: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

A C B

Torre de Hanói• Se o valor fornecido para o programa for 3, então a sequência de chamadas

e as saídas geradas são:

321

Page 32: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

A C B

Torre de Hanói• Se o valor fornecido para o programa for 3, então a sequência de chamadas

e as saídas geradas são:

3 21

Page 33: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

A C B

Torre de Hanói• Se o valor fornecido para o programa for 3, então a sequência de chamadas

e as saídas geradas são:

321

Page 34: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

A C B

Torre de Hanói• Se o valor fornecido para o programa for 3, então a sequência de chamadas

e as saídas geradas são:

321

• Ok, mas só podemos mover um disco por vez

• Como a pilha com os 2 discos menores foi parar no pino C, e depois no pino B?

Page 35: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

A C B

Torre de Hanói• Se o valor fornecido para o programa for 3, então a sequência de chamadas

e as saídas geradas são:

321

Page 36: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

A C B

Torre de Hanói• Se o valor fornecido para o programa for 3, então a sequência de chamadas

e as saídas geradas são:

32

1

Movimento = 1

Mova o disco 1 do pino A para o pino B

Page 37: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

A C B

Torre de Hanói• Se o valor fornecido para o programa for 3, então a sequência de chamadas

e as saídas geradas são:

3 2 1

Movimento = 2

Mova o disco 2 do pino A para o pino C

Page 38: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

A C B

Torre de Hanói• Se o valor fornecido para o programa for 3, então a sequência de chamadas

e as saídas geradas são:

3 21

Movimento = 3

Mova o disco 1 do pino B para o pino C

Page 39: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

A C B

Torre de Hanói• Se o valor fornecido para o programa for 3, então a sequência de chamadas

e as saídas geradas são:

321

Movimento = 4

Mova o disco 3 do pino A para o pino B

Page 40: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

A C B

Torre de Hanói• Se o valor fornecido para o programa for 3, então a sequência de chamadas

e as saídas geradas são:

321

Movimento = 5

Mova o disco 1 do pino C para o pino A

Page 41: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

A C B

Torre de Hanói• Se o valor fornecido para o programa for 3, então a sequência de chamadas

e as saídas geradas são:

32

1

Movimento = 6

Mova o disco 2 do pino C para o pino B

Page 42: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

A C B

Torre de Hanói• Se o valor fornecido para o programa for 3, então a sequência de chamadas

e as saídas geradas são:

321

PARABÉNS!Conseguiu mover os 3 discos com o mínimo de movimentos

Movimento = 7

M

Quantidade mínima de movimentos

Número dediscos

Mova o disco 1 do pino A para o pino B

Page 46: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:
Page 47: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:
Page 48: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:
Page 49: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:
Page 50: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:
Page 51: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:
Page 52: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:
Page 53: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:
Page 54: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:
Page 55: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:
Page 56: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:
Page 57: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:
Page 58: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:
Page 59: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:
Page 60: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:
Page 61: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:
Page 62: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:
Page 63: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:
Page 64: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:
Page 65: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:
Page 66: Recursão. Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:

Tarefa• Torre de Hanói

Escrever um programa em C que calcula o movimento de n discos de acordo com as regras estabelecidas