Universidade Federal de Ouro Preto – UFOP Instituto de Ciências Exatas e Biológicas – ICEB Departamento de Computação – DECOM Disciplina: Estruturas de Dados I – BCC202
Professor (Teórica): David Menotti (menottid@gmail.com) Professora (Prática): Emiliana Simões (simoes.eml@gmail.com)
UFOP – DECOM – Estrutura de Dados I – 1º. Sem 2010 – David, Emiliana 1 AULA PRÁTICA 5: Recursividade
Na recursividade, dentro do corpo de uma função é chamada novamente a própria função.
Uma rotina recursiva R, é formada por um conjunto de comandos C (que não contém chamadas a R) e uma chamada recursiva a ela própria (R):
Entretanto, existe uma forma de recursão indireta, onde as rotinas se ligam através de uma sucessão de chamadas, que acaba retornando à primeira chamada efetuada:
Toda rotina recursiva deve definir uma condição de parada, senão ela seria executada infinitamente (loop infinito). Assim, em uma rotina recursiva, temos:
Solução trivial: Não necessita de recursão para ser obtida;
Solução geral: Obtida através de uma chamada recursiva.
Exemplo 1: Cálculo do fatorial de um número Solução trivial: 0!=1
Solução geral: n!=n×(n−1)!
Implementação em C:
int fat(int n){
if (n <= 0) return 1;
else
return n * fat(n-1);
}
Universidade Federal de Ouro Preto – UFOP Instituto de Ciências Exatas e Biológicas – ICEB Departamento de Computação – DECOM Disciplina: Estruturas de Dados I – BCC202
Professor (Teórica): David Menotti (menottid@gmail.com) Professora (Prática): Emiliana Simões (simoes.eml@gmail.com)
UFOP – DECOM – Estrutura de Dados I – 1º. Sem 2010 – David, Emiliana 2 Observação: Para cada chamada de uma função os parâmetros e as variáveis locais são empilhados na pilha de execução. Assim, memória é necessária para acomodar variáveis a cada chamada recursiva. Portanto, uma definição recursiva não implica necessariamente que a implementação recursiva é a melhor solução!
Exemplo 2: O cálculo do fatorial é um caso onde a recursão é menos eficiente que a iteração, pois proporciona uma recursão de cauda (chamada recursiva realizada no final, criando um loop de chamadas até que a condição de parada o encerre).
int fat2(int n){
int f = 1;
while(n > 0){
f = f * n;
n = n – 1;
}
return f;
}
Exercícios:
1- Faça um programa que preencha por leitura (do teclado), um vetor de x elementos reais (x definido pelo usuário), imprima o conteúdo deste vetor, e que também imprima o resultado do somatório dos elementos deste vetor, calculado por uma função recursiva.
2- Seja uma linguagem hipotética na qual não existe operadores para adição, nem subtração.
Sabe-se que nesta linguagem, existe uma função succ(n) que dá o sucessor de n, e existe também uma função pred(n) que dá o predecessor de um número n. Usando apenas essas funções (succ/pred), defina a função recursiva add(x, y), que toma como argumento os números naturais x e y, e retorna sua soma. Em seguida, mostre como a recursão de cauda pode ser eliminada da função add(x, y), usando-se o comando de repetição.
3- Considere a função Comb(n, k), que representa o número de grupos distintos com k elementos que podem ser formados a partir de n elementos. Por exemplo, Comb(4, 3) = 4, pois com 4 elementos (A, B, C, D), é possível formar 4 diferentes grupos: ABC, ABD, ACD e BCD. Sabe-se que:
<
<
− +
−
−
=
=
=
n k 1 se ) k , n ( Comb )
k , Comb(n
n k se 1
1 k se n ) k , n ( Comb
1 1
1
Implemente uma função recursiva para Comb (n, k). Implemente também uma função não recursiva de Comb (n, k), sabendo-se que: Comb (n, k) = n! / (k! (n-k)!).
Universidade Federal de Ouro Preto – UFOP Instituto de Ciências Exatas e Biológicas – ICEB Departamento de Computação – DECOM Disciplina: Estruturas de Dados I – BCC202
Professor (Teórica): David Menotti (menottid@gmail.com) Professora (Prática): Emiliana Simões (simoes.eml@gmail.com)
UFOP – DECOM – Estrutura de Dados I – 1º. Sem 2010 – David, Emiliana 3 4- O problema conhecido como Torre de Hanói consiste em transferir, com o menor número de movimentos, a torre composta por N discos do pino A (origem) para o pino C (destino), utilizando o pino B como auxiliar. Somente um disco pode ser movimentado de cada vez e um disco não pode ser colocado sobre outro disco de menor diâmetro.
Solução: Transferir a torre com N-1 discos de A para B, mover o maior disco de A para C e transferir a torre com N-1 discos de B para C. Como a transferência da torre com N-1 discos não é uma operação possível de ser executada, ela deverá ser reduzida sucessivamente até transformar-se no movimento de um único disco.
Implemente este algoritmo.