Anda di halaman 1dari 22

Programao II

Prof. Mateus Raeder

Universidade do Vale do Rio dos Sinos


- So Leopoldo -

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

Programao II Prof. Mateus Raeder

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 Prof. Mateus Raeder

Implementao iterativa da
multiplicao

Programao II Prof. Mateus Raeder

Multiplicao Recursiva
Podemos tambm implementar a multiplicao
de um nmero m por n somando m com a
multiplicao de m por n-1.
m x n = m+m x (n-1)
2x4 = 2 + 2x(3)

Chamamos novamente a operao de


multiplicao, mas agora para resolver um subproblema que parte do anterior.
Um mtodo que chama a si mesmo
chamado de mtodo recursivo.

Programao II Prof. Mateus Raeder

Multiplicao Recursiva
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

Que pode ser implementado em Java da seguinte maneira:

Recurso o equivalente em programao da


induo matemtica que uma maneira de
definir algo em termos de si mesmo.
Programao II Prof. Mateus Raeder

Fatorial recursivo
Definio no recursiva (tradicional):
N! = 1, para N = 0.
N! = 1 x 2 x 3 x .... x N, para N>0

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

Programao II Prof. Mateus Raeder

Fatorial recursivo
Definio no recursiva (tradicional):
N! = 1, para N = 0.
N! = 1 x 2 x 3 x .... x N, para N>0

implementao iterativa:

Programao II Prof. Mateus Raeder

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

Programao II Prof. Mateus Raeder

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 Prof. Mateus Raeder

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

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 Prof. Mateus Raeder

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 Prof. Mateus Raeder

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 Prof. Mateus Raeder

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
parmetros
reais
Programao II Prof. Mateus Raeder

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 Prof. Mateus Raeder

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?

Programao II Prof. Mateus Raeder

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
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 Prof. Mateus Raeder

Registro de ativao
Registro de
ativao de
f3()

Parmetros e
variveis locais
Endereo de retorno
Valor de retorno

Registro de
ativao de
f2()

Parmetros e
variveis locais
Endereo de retorno
Valor de retorno

Registro de
ativao de
f1()

Parmetros e
variveis locais
Endereo de retorno
Valor de retorno

Registro de
ativao do
mtodo
main()

topo da pilha

...

Programao II Prof. Mateus Raeder

Registro de ativao: exemplo


n=1
Registro de
ativao de
fat(1)

PC=7

1
n=2

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

topo

topo

PC=7

fat (4) main

=24
3*fat(2) =6

4*fat(3)

2*fat(1)

2
n=3

fatorial de 4

topo

PC=7

6
n=4

topo

PC = 12

24
resultado=24

Programao II Prof. Mateus Raeder

=2

Registro de ativao: exemplo


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.

Programao II Prof. Mateus Raeder

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 Prof. Mateus Raeder

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 Prof. Mateus Raeder

Anda mungkin juga menyukai