Pré-visualização parcial do texto
Baixe 02 - Recursividade (WORD) e outras Notas de estudo em PDF para Informática, somente na Docsity!
ALGESD 02 Recursividade Prof. Dr. Marcelo Duduchi Doo Recursividade = Para resolver alguns problemas é útil chamar a própria rotina que está executando; = Uma rotina com esta característica é denominada de recursiva e geralmente apresenta: Um critério de parada; Uma ou mais chamadas à própria rotina; —— Recursividade m O critério de parada geralmente representa uma ou mais situações em que a solução é trivial e não necessita de da chamada recursiva; m O sucesso de uma rotina recursiva está ligada à definição de um critério de parada e uma chamada própria que conduz o problema ao critério de parada; — O. Recursividade (fatorial) = O primeiro exemplo a ser discutido é a solução do problema de cálculo do fatorial de maneira recursiva; = Note que este é um bom exemplo didático mas um péssimo exemplo de utilização de recursividade (trataremos mais tarde sobre isto); — O Fatorial (Java) public static int fat(int n) ( if(n == 0) return 1; else return n*fat(n-1); -——— Recursividade = Rotinas recursivas que apresentam uma chamada própria ao final são cnamadas de recursividade de calda e geralmente se apresentam pouco eficientes; = Note que facilmente conseguimos transformar a recursividade de calda em um loop e neste caso a rotina se torna mais eficiente pois não necessita fazer todas as chamadas recursivas; — O. Recursividade (Fibonacci) = O segundo exemplo de rotina recursiva a ser apresentado é a rotina fibonacci que calcula o n- ésimo termo da sequência de Fibonacci: 1,1,2,3,5,8,13,21,34,55,... = O primeiro termo é 1. O segundo também é um e os próximos termos têm o valor da soma dos dois anteriores. Desta forma, o sexto termo, por exemplo, tem o valor 8 e assim por diante; -—— Recursividade (Fibonacci) m Vamos pensar no algoritmo: o Qual o critério de parada? Bem ,nos dois primeiros termos o valor é um e eles independem dos anteriores e então podem ser considerados como tal; = Onde se encontra a chamada recursiva? A cada chamada o cálculo do termo n de Fibonacci é a soma dos termos n-1 e n-2; —— O. Recursividade (Hanoi) = Antes de apresentarmos a rotina recursiva de busca binária vamos discutir um último exemplo que é o problema das Torres de Hanoi; = Este exemplo é diferente dos outros até aqui apresentados pois a solução iterativa é bastante trabalhosa e necessitaria de estruturas auxiliares; — O Recursividade (Hanoi) m O problema consiste em 3 torres e n discos que devem ser transportados da primeira torre para a terceira seguindo algumas regras; m Na solução só podemos manipular um disco de cada vez e não podemos deixar discos maiores sobre discos menores; —— Recursividade (Hanoi) = Antes de discutirmos o algoritmo recursivo, veja uma animação da solução da Torre de Hanoi com 4 discos. m As hastes não estão presentes mas ainda temos que trabalhar com 3 torres; m Observe os movimentos... -—— Recursividade (Hanoi) m Note que para resolver o problema de 4 discos precisamos de resolver primeiro um problema de mesma natureza de 3 discos passar o disco grande para a última haste e resolver novamente o problema de 3 discos... O mesmo acontece com os problemas menores de2e 1 discos... —— O Hanoi (Java) public static void hanoi(int n, char A, char B, char C) ( if(n>0) ( hanoi(n-1, A, C, B); System.out.printin("Mover disco "+n+" de "+A+ "para "+C); hanoi(n-1, B,A, C); ) )