Академический Документы
Профессиональный Документы
Культура Документы
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
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.
Programao II
Definio recursiva:
N! = 1, para N <= 1; N! = N x (N - 1)!, para N > 0.
Programao II
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
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:
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
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
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).
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
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
fib(n)=n fib(n)=fib(n-2)+fib(n-1)
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();
parmetros reais
Programao II
23
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?
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
topo
fatorial de 4
fat (4) main 4*fat(3) =24 3*fat(2) =6 2*fat(1) =2 1
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.
Programao II
29
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