Upload
internet
View
134
Download
9
Embed Size (px)
Citation preview
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
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
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!
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
Fatorial1 5! = 5 * 4!2 4! = 4 * 3!3 3! = 3 * 2!4 2! = 2 * 1!5 1! = 1 * 0!6 0! = 1
120
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
Recursão e a Pilha de Execução (stack)
Supõe que façamos• int x = fatorial(4);
X
Função Recursiva
4
Recursão e a Pilha de Execução (stack)
fatorial(4)
XRetorno
n
4
Recursão e a Pilha de Execução (stack)
fatorial(4)
XRetorno
n
fatorial(3)
3
Retorno
n
4
Recursão e a Pilha de Execução (stack)
fatorial(4)
XRetorno
n
fatorial(3)
3
Retorno
n
fatorial(2)2
Retorno
n
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
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
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
4
Recursão e a Pilha de Execução (stack)
fatorial(4)
XRetorno
n
fatorial(3)
3
Retorno
n
fatorial(2)2
Retorno
n1Retorno
4
Recursão e a Pilha de Execução (stack)
fatorial(4)
XRetorno
n
fatorial(3)
3
Retorno
n
2Retorno
4
Recursão e a Pilha de Execução (stack)
fatorial(4)
XRetorno
n
6Retorno
24
Recursão e a Pilha de Execução (stack)
XRetorno
int x = fatorial(4);
Recursão e a Pilha de Execução (stack)
X
int x = fatorial(4);
24
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
Elementos de uma função recursiva
Exemplo:
Função Recursiva
Função Recursiva
Elementos de uma função recursiva
Exemplo: Condição de Parada
Função Recursiva
Elementos de uma função recursiva
Exemplo: Chamada recursiva a uma instância menor
Função Recursiva
Elementos de uma função recursiva
Exemplo: Processamento de apoio
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)
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)
Fibonacci• O número de Fibonacci Fn para n>=0 é definido da seguinte maneira:
Função Recursiva
Exercício 01
Exercício 2
O que faz o programa abaixo? Justifique!
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.
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
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
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
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
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?
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
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
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
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
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
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
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
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
Torre de Hanói
Torre de Hanói
Torre de Hanói
Tarefa• Torre de Hanói
Escrever um programa em C que calcula o movimento de n discos de acordo com as regras estabelecidas
Material Baseado em:
• Estrutura de Dados Usando C (Livro)
• Slides do Prof. Daniel M. Martin