Algoritmo e Estrutura de
Dados I
Aulas 17 – Recursividade
Márcia Marra
[email protected]
Recursividade
•
•
•
•
Simplificam a solução de alguns problemas
Geralmente deixam o código mais conciso
São mais lentas que as funções iterativas
Erros na implementação podem levar a
“estouro” de pilha
• Exemplos clássicos:
– Cálculo de fatorial;
– Série de Fibonacci;
– Jogo da Torre de Hanoi
2
Fatorial
• Ex: Fatorial de 4
3
Fatorial - Solução
#include <stdio.h>
int fat (int n) {
if ( n =0) return 1;
else return n * fat (n-1);
}
int main() {
int num;
printf("\nDigite um valor para n: ");
scanf("%d", &num);
printf("\nO fatorial de %d é %d", num,
fat(num));
return 0;
}
4
Execução
5
Fibonacci
• A série de Fibonacci é formada de
maneira que o elemento seguinte é
composto pela soma dos dois elementos
anteriores.
1, 1, 2, 3, 5, 8, 13, 21 ...
• Fib (0) = 0
• Fib (1) = 1
• Fib (n) = Fib (n-1) + Fib (n-2)
6
Fibonacci - Solução
#include <stdio.h>
int fib (int n) {
if ( n==0) return 0;
else if (n==1) return 1;
else return fib(n-1)+ fib(n-2);
}
int main() {
int num;
printf("\nEntre com um valor para n: ");
scanf("%d", &num);
printf("\nFibonacci é %d", fib(num));
return 0;
}
7
Execução
8
Torre de Hanoi
• Considere três hastes, A, B e C.
• Na haste A encontram-se n discos, com tamanhos
diferentes, arrumados do menor maior, de cima baixo;
• Deve-se passar todos os discos da haste A para a haste
B, usando a haste C como auxiliar e seguindo algumas
regras.
9
Torre de Hanoi
• Regras do Jogo:
1. Somente um disco pode ser movido de
cada vez.
2. Nenhum disco pode ser colocado
sobre um disco menor.
3. Qualquer disco pode ser movido de
qualquer haste para qualquer outra
haste, desde que respeitada a regra 2.
10
Torre de Hanoi - Recursividade
• Suponha 4 discos, como no desenho abaixo.
Monte a pilha de execução para este exemplo.
11
Torre de Hanoi – pilha de execução
Disco 1 de A para C
Disco 2 de A para B
Disco 1 de C para B
Disco 3 de A para C
Disco 1 de B para A
Disco 2 de B para C
Disco 1 de A para C
Disco 4 de A para B
Disco 1 de C para B
Disco 2 de C para A
Disco 1 de B para A
Disco 3 de C para B
Disco 1 de A para C
Disco 2 de A para B
Disco 1 de C para B
12
Torre de Hanoi - Solução
#include <stdio.h>
int torre (int disco, char de, char para, char aux){
if (disco == 1)
printf ("\nMover disco %d da torre %c para a
torre %c", disco, de, para);
else {
torre (disco-1, de, aux, para);
printf ("\nMover disco %d da torre %c para a
torre %c", disco, de, para);
torre (disco-1, aux, para, de);
}
return(0);
}
13
Torre de Hanoi - Solução
int main () {
int num;
printf ("Digite a quantidade de
discos da torre A: ");
scanf ("%d", &num);
torre (num, 'A', 'B', 'C');
return(0);
}
14
Execução
15
Execução 2
16
Teste Surpresa
•
Use a função puzzle abaixo para responder as perguntas:
int puzzle(int base, int limit) {
//base and limit are nonnegative numbers
if ( base > limit ) return -1;
else if ( base == limit ) return 1;
else return base * puzzle(base + 1, limit);
}
1) Identifique os casos base da função puzzle();
2) Identifique o caso recursivo da função puzzle();
3) Mostre a pilha de execução e o que será impresso pelas seguintes
chamadas:
1) printf(“%d\n”, puzzle(14,10));
2) printf(“%d\n”, puzzle(4,7));
3) printf(“%d\n”, puzzle(0,0));
17
Download

Recursividade