Вы находитесь на странице: 1из 30

Recursividade

Recurso Repetio pode ser obtida de 2 maneiras:


Laos (for, while, etc) Chamada recursiva de mtodos (recurso)

Recurso uma tcnica de programao na qual um mtodo chama a si mesmo.

Recursividade Considere por exemplo que queremos definir a operao de multiplicao, em termos da operao mais simples de adio:
Informalmente, multiplicar m por n (onde n no negativo) somar m, n vezes:

Soluo de problema que realiza operaes repetidamente pode ser implementada usando comando de repetio (tambm chamado de comando iterativo ou comando de iterao).

Programao II

Implementao iterativa da multiplicao

Programao II

Multiplicao Revursiva Podemos tambm implementar a multiplicao de um nmero m por n somando m com a multiplicao de m por n-1.
m * n = m + (m * (n-1)) 2*4 = 2 + (2*3)

Estou chamando de novo a operao de multiplicao mas agora para resolver um sub-problema que parte do anterior.

Programao II

A multiplicao de um nmero inteiro por outro inteiro maior ou igual a zero pode ser definida recursivamente por induo matemtica como a seguir:
m x n = 0 se n ==0 m n = m + (m (n 1)) se n > 0 Recurso o equivalente em programao da induo matemtica que uma maneira de definir algo em termos de si mesmo.

Que pode ser implementado em Java da seguinte maneira:

Programao II

Fatorial recursivo Definio no recursiva (tradicional):


N! = 1, para N <= 1. N! = 1 x 2 x 3 x .... x N, para N>0

Definio recursiva:
N! = 1, para N <= 1; N! = N x (N - 1)!, para N > 0.

Programao II

Fatorial recursivo Definio no recursiva (tradicional):


N! = 1, para N <=1. N! = 1 x 2 x 3 x .... x N, para N>0

implementao iterativa:

Programao II

Fatorial recursivo Caso Definio recursiva: base N! = 1, para N <= 1; N! = N x (N - 1)!, para N > 0.

Caso recursivo

Um mtodo que chama a si mesmo chamado de mtodo recursivo.

Programao II

Caractersticas dos programas recursivos a) Chama a si mesmo para resolver parte do problema; b) Existe pelo menos um caso bsico que resolvido sem chamar a si mesmo.

Programao II

10

Recurso Linear A recurso linear a forma mais simples de recurso. O mtodo faz apenas uma chamada recursiva (uma chamada a si mesmo). Esse tipo de recurso til quando se analisam os problemas de algoritmo em termos:
Do primeiro ou ltimo elemento Mais um conjunto restante que tem a mesma estrutura que o conjunto original

Programao II

11

Recurso Linear (Exemplo) Exemplo: Soma de n inteiros em um array A se n=1 somaLinear=A[0] seno somaLinear = A[n-1]+SomaLinear(A, n-1)
Algorithm linearSum(A, n):

Input:

Output:

um array A e um inteiro n que contm o tamanho de A

A soma dos primeiros n elementos de A if n = 1 then return A[0] else return linearSum(A, n - 1) + A[n -1]

Programao II

12

Recurso Linear (Exemplo)

Trace:
call LinearSum (A,5) call LinearSum (A,4) call LinearSum (A,3) call LinearSum (A,2) call LinearSum (A,1) return A[0] = 4 return 4 + A [1 ] = 4 + 3 = 7 return 7 + A [2 ] = 7 + 6 = 13 return 13 + A[3] = 13 + 2 = 15 return 15 + A[4] = 15 + 5 = 20

Programao II

13

Exerccio 1 Faa um mtodo recursivo que inverta o contedo de uma determinada array.

Programao II

14

Invertendo o contedo de um Array


Algoritmo ReverseArray(A, i, j): Input: Um array A e 2 ndices inteiros i ej Output: O inverso dos elementos em A comeando no ndice i e fianlizando em j if i < j then Swap A[i] and A[ j] ReverseArray(A, i + 1, j - 1) return

15

Definindo argumentos
Ao criar mtodos recursivos, importante definir os mtodos de maneira a facilitar a recurso. Isso algumas vezes requer que definamos alguns parmetros adicionais a serem passados pelo mtodo recursivo.
Por exemplo, ns definimos o mtodo recursivo como ReverseArray(A, i, j), no como ReverseArray(A).

Uma maneira mais elegante :


criar um mtodo pblico com menos argumentos e no recursivo (para as outras classes chamarem) e um mtodo privado recursivo com os argumentos necessrios. mtodo pblico no recursivo mtodo privado recursivo
16

Recurso Binria

Recurso binria ocorre sempre que houver 2 chamadas recursivas para cada caso no bsico. Estas chamadas podem, por exemplo, ser usadas para resolver duas metades do mesmo problema.

17 Us in

Seqncia de Fibonacci A seqncia de Fibonacci a seqncia de inteiros:


0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...

Cada elemento nessa seqncia a soma dos dois elementos anteriores. Por exemplo:
0+1=1; 1+1=2; 1+2=3; 2+3=5 ... Assume-se que os 2 primeiros elementos so 0 e 1.

Se partirmos que fib(0)=0 e fib(1)=1 e assim por diante, podemos definir um nmero da seqncia fibonnaci da seguinte maneira:
fib(n)=n fib(n)=fib(n-2)+fib(n-1) se n==0 OU n==1 se n>=2
Programao II 18

Seqncia de Fibonacci (Implementao)

fib(n)=n fib(n)=fib(n-2)+fib(n-1)

se n==0 OU n==1 se n>=2

Programao II

19

Mltiplas chamadas recursivas Recurso mltipla ocorre quando um mtodo faz mais de 2 chamadas recursivas. Aplicao mais comum: enumerar vrias configuraes para resolver um quebra-cabeas

20

Chamada a um mtodo

parmetros formais

int x=2, y=3; Ponto p = new Ponto (); p.setaCoordenadas (x, y); p.exibe();

Tipos dos parmetros reais devem ser compatveis com tipos dos parmetros formais

parmetros reais

Programao II

21

Chamada a um mtodo

parmetros formais

int x=2, y=3; Ponto p = new Ponto (); p.setaCoordenadas (x, y); p.exibe();

Parmetros formais so variveis locais do mtodo. Outras variveis locais podem ser declaradas (ex: r em mult).
Programao II 22

parmetros reais

Chamada a um mtodo

parmetros formais

int x=2, y=3; Ponto p = new Ponto (); p.setaCoordenadas (x, y); p.exibe();

Quando execuo de uma chamada termina, execuo retorna ao ponto da chamada.

parmetros reais

Programao II

23

Chamada de mtodo Quando um mtodo chamado:


necessrios inicializar os parmetros formais com os valores passados como argumento; sistema precisa saber onde reiniciar a execuo do programa; ...

Informaes de cada mtodo (variveis e endereo de retorno) deve ser guardada at o mtodo acabar a sua execuo. Mas como o programa diferencia a varivel n da primeira chamada da varivel n da segunda chamada do mtodo fatorialr?

Profa. Patricia Jaques - Programao II

24

Registro de ativao
Registro de ativao:
rea de memria que guarda o estado de uma funo, ou seja:
variveis locais valores dos parmetros; endereo de retorno (instruo aps a chamada do mtodo corrente); valor de retorno.

Registro de ativao so criados em uma pilha em tempo de execuo; Existe um registro de ativao (um n na pilha) para cada chamada ao mtodo; Quando um mtodo chamado criado um registro de ativao para este e este empilhado na pilha; Quando o mtodo finaliza sua execuo o registro de ativao desse mtodo desalocado.

Programao II

25

Registro de ativao
Registro de ativao de f3() Parmetros e variveis locais Endereo de retorno Valor de retorno Parmetros e variveis locais Endereo de retorno Valor de retorno Parmetros e variveis locais Endereo de retorno Valor de retorno

topo da pilha

Registro de ativao de f2() Registro de ativao de f1() Registro de ativao do mtodo main()

...

Programao II

26

Registro de ativao: exemplo


n=1

topo

fatorial de 4
fat (4) main 4*fat(3) =24 3*fat(2) =6 2*fat(1) =2 1

Registro de ativao de fat(1)


Registro de ativao de fat(2) Registro de ativao de fat(3) Registro de ativao de fat(4)

PC=7

1
n=2 PC=7

topo

2
n=3
PC=7

topo

6
n=4 PC = 12

topo

24
resultado=24

Programao II

27

A cada trmino de FAT, o controle retorna para a expresso onde foi feita a chamada na execuo anterior, e o ltimo conjunto de variveis que foi alocado liberado nesse momento. Esse mecanismo utiliza uma pilha. A cada nova chamada do mtodo FAT, um novo conjunto de variveis (n, FAT) alocado.

Dicas para desenvolver algoritmos recursivos

Montar, inicialmente, uma definio (especificao) recursiva do problema, como segue:


1. Definir pelo menos um caso bsico; 2. Quebrar o problema em subproblemas, definindo o(s) caso(s) recursivo(s); 3. Fazer o teste de finitude, isto , certificar-se de que as sucessivas chamadas recursivas levam obrigatoriamente, e numa quantidade finita de vezes, ao(s) caso(s) bsico(s).

Depois, s traduzir essa especificao para a linguagem de programao.

Programao II

29

Vantagens e Desvantagens Vantagens da recurso


Reduo do tamanho do cdigo fonte Maior clareza do algoritmo para problemas de definio

naturalmente recursiva

Desvantagens da recurso
Baixo desempenho na execuo devido ao tempo para gerenciamento das chamadas Dificuldade de depurao dos subprogramas recursivos, principalmente se a recurso for muito profunda

Programao II

30

Вам также может понравиться