Anda di halaman 1dari 12

Recurso

Adaptado dos slides do livro:


Java, an Introduction to Problem Solving and Programming, 4d Walter Savitch
Ctia Vaz

Introduo
Por vezes possvel e til definir um mtodo custa dele prprio. Nestes casos, diz-se que a definio recursiva. O mtodo continua a invocar-se a ele prprio at atingir um caso base, que pode ser resolvido sem quaisquer chamadas recursivas ao mtodo.
Ctia Vaz

Como funciona a recurso...


Considere-se vrios mtodos m1, m2, , mn, em que o mtodo m1 chama o mtodo m2, o mtodo m2 chama o mtodo m3, , o mtodo mn-1 chama o mtodo mn.
Quando cada mtodo termina, o controlo retorna para a instruo que se segue invocao do mtodo.

Na recurso, os mtodos m1, m2, , mn so todos o mesmo mtodo.


Ctia Vaz

Como funciona a recurso...


Como sempre, o mtodo m1 no pode terminar a execuo enquanto o mtodo m2 no completar a execuo, o mtodo m2 no pode terminar a execuo enquanto o mtodo m3 no completar a execuo, , o mtodo mn-1 no pode terminar a execuo enquanto o mtodo mn no completar a execuo. Se o mtodo mn representar um caso de paragem, pode completar a execuo, ento o mtodo mn-1 pode completar a execuo, , ento o mtodo m3 pode completar a execuo, ento o mtodo m2 pode completar a execuo, ento o mtodo m1 pode completar a execuo.
Ctia Vaz

Exemplo
Considere-se o caso do factorial de um nmero. Sabe-se que:
0!=1; n!=n*(n-1)!,

isto ,
factorial(0)=1; factorial(n)=n*factorial(n-1); Recursao.java
Ctia Vaz

Recurso infinita
Se a invocao recursiva dentro do mtodo no usar um parametro mais simples ou menor, nunca se conseguir atingir um caso base. Tal mtodo vai continuar a chamar-se at que a estrutura de dados que utilizada para guardar as chamadas recursivas (stack) se tornar demasiado grande para ser manipulada pelo computador, o que ir resultar numa stack overflow. Nestes casos, a invocao do mtodo leva a uma recurso infinita.
Ctia Vaz

Recurso versus Iterao


Normalmente, a execuo de uma verso recursiva de um mtodo menos eficiente do que a verso iterativa correspondente. Isto devido a ser necessrio guardar todas as chamadas recursivas e das computaes suspensas. No entanto, pode ser muito mais fcil escrever um mtodo recursivo do que escrever o mtodo iterativo correspondente.
Ctia Vaz

Exemplo: Nmeros de Fibonnaci


A srie Fibonnaci ocorre frequentemente na natureza como taxa de crescimento para certas populaes de animais idealizadas. A srie comea com 0 e 1, e cada nmero de fibonnaci sucessivo a soma dos dois nmeros de fibonacci anteriores.
Fibonacci(1)=0; Fibonacci(2)=1; Fibonacci(n)=Fibonacci(n-1) + Fibonacci(n-2), para n>2

Fibonacci.java

Ctia Vaz

Exemplo: Pesquisa Binria


Ir ser desenhado um mtodo recursivo que determina se um determinado nmero se encontra ou no num array ordenado.
Se o nmero se encontrar no array, o mtodo ir retornar a posio do nmero nesse array, caso contrrio ir retornar -1.
Ctia Vaz

Exemplo: Pesquisa Binria


Ir ser desenhado um mtodo recursivo que determina se um determinado nmero se encontra ou no num array ordenado.
Se o nmero se encontrar no array, o mtodo ir retornar a posio do nmero nesse array, caso contrrio ir retornar -1. BinarySearch.java
Ctia Vaz

Exemplo: Merge Sort


Algoritmos de ordenao eficientes so muitas vezes implementados de forma recursiva. Exemplo:Merge Sort. O Algoritmo Merge Sort segue uma aproximao divide and conquer. Considere-se a utilizao do algoritmo Merge Sort num array:
O array dividido em metades e as metades so ordenadas recursivamente; Os sub-arrays ordenados so agrupados para obter um array ordenado maior.
Ctia Vaz

Exemplo: Merge Sort


pseudocdigo
Se o array tiver apenas um elemento, stop. Caso contrrio Copiar a primeira metade dos elementos para um array designado por frente. Copiar a segunda metade dos elementos para um array designado por cauda. Ordenar o array frente recursivamente. Ordenar o array cauda recursivamente. Juntar os arrays frente e cauda. MergeSort.java
Ctia Vaz

Anda mungkin juga menyukai