Entretanto, existe uma forma de

Texto

(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 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);

}

(2)

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)!).

(3)

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.

Imagem

Referências

temas relacionados :