SlideShare uma empresa Scribd logo
1 de 30
Recursividade
Prof. Mauricio Wieler Orellana
mauricioow@gmail.com
Recursão
• Repetição pode ser obtida de 2 maneiras:
– Laços (for, while, etc)
– Chamada recursiva de métodos (recursão)
• Recursão é uma técnica de programação na qual um
método chama a si mesmo.
Prof. Mauricio Wieler Orellana
3
Recursividade
• Considere por exemplo que queremos definir a
operação de multiplicação, em termos da operação
mais simples de adição:
– Informalmente, multiplicar m por n (onde n não é negativo) é
somar m, n vezes:
• Solução de problema que realiza operações
repetidamente pode ser implementada usando
comando de repetição (também chamado de
comando iterativo ou comando de iteração).
Prof. Mauricio Wieler Orellana
4
Implementação iterativa da multiplicação
Prof. Mauricio Wieler Orellana
5
Multiplicação Revursiva
• Podemos também implementar a multiplicação de
um número m por n somando m com a multiplicação
de m por n-1.
– m * n = m + (m * (n-1))
– 2*4 = 2 + (2*3)
• Estou chamando de novo a operação de
multiplicação mas agora para resolver um sub-
problema que é parte do anterior.
Prof. Mauricio Wieler Orellana 6
• A multiplicação de um número inteiro por outro inteiro
maior ou igual a zero pode ser definida
recursivamente por indução matemática 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:
Recursão é o equivalente em programação da indução
matemática que é uma maneira de definir algo em termos de si
mesmo.
Prof. Mauricio Wieler Orellana
7
Fatorial recursivo
• Definição não recursiva (tradicional):
N! = 1, para N <= 1.
N! = 1 x 2 x 3 x .... x N, para N>0
• Definição recursiva:
N! = 1, para N <= 1;
N! = N x (N - 1)!, para N > 0.
Prof. Mauricio Wieler Orellana
8
Fatorial recursivo
• Definição não recursiva (tradicional):
N! = 1, para N <=1.
N! = 1 x 2 x 3 x .... x N, para N>0
• implementação iterativa:
Prof. Mauricio Wieler Orellana
9
Fatorial recursivo
Definição recursiva:
N! = 1, para N <= 1;
N! = N x (N - 1)!, para N > 0.
Um método que chama a si mesmo é
chamado de método recursivo.
Caso
base
Caso
recursivo
Prof. Mauricio Wieler Orellana 10
Características dos programas recursivos
a) Chama a si mesmo para resolver parte do problema;
b) Existe pelo menos um caso básico que é resolvido
sem chamar a si mesmo.
Recursão Linear
• A recursão linear é a forma mais simples de
recursão.
• O método faz apenas uma chamada recursiva
(uma chamada a si mesmo).
• Esse tipo de recursão é ú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
Prof. Mauricio Wieler Orellana
11
Recursão Linear (Exemplo)
• Exemplo: Soma de n inteiros em um array A
se n=1 somaLinear=A[0]
senão somaLinear = A[n-1]+SomaLinear(A, n-1)
Prof. Mauricio Wieler Orellana
12
Algorithm linearSum(A, n):
Input:
um array A e um inteiro n que contém o
tamanho de A
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]
Prof. Mauricio Wieler
Orellana
13
Recursão Linear (Exemplo)
Trace:
LinearSum(A,5)
LinearSum(A,1)
LinearSum(A,2)
LinearSum(A,3)
LinearSum(A,4)
call
call
call
call 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
call return 15 + A[4] = 15 + 5 = 20
Exercício 1
• Faça um método recursivo que inverta o conteúdo de
uma determinada array.
Prof. Mauricio Wieler Orellana
14
15
Invertendo o conteúdo 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 começando no índice i e
fianlizando em j
if i < j then
Swap A[i] and A[ j]
ReverseArray(A, i + 1, j - 1)
return
16
Definindo argumentos
• Ao criar métodos recursivos, é importante definir os métodos de
maneira a facilitar a recursão.
• Isso algumas vezes requer que definamos alguns parâmetros
adicionais a serem passados pelo método recursivo.
– Por exemplo, nós definimos o método recursivo como ReverseArray(A, i, j),
não como ReverseArray(A).
• Uma maneira mais elegante é:
– criar um método público com menos argumentos e não recursivo (para as
outras classes chamarem)
– e um método privado recursivo com os argumentos necessários.
método público
não recursivo
método
privado
recursivo
Usi
ng
17
Recursão Binária
• Recursão binária ocorre sempre que houver
2 chamadas recursivas para cada caso não
básico.
• Estas chamadas podem, por exemplo, ser
usadas para resolver duas metades do
mesmo problema.
Prof. Mauricio Wieler Orellana
18
Seqüência de Fibonacci
• A seqüência de Fibonacci é a seqüência de inteiros:
– 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
• Cada elemento nessa seqüência é 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 são 0 e 1.
• Se partirmos que fib(0)=0 e fib(1)=1 e assim por
diante, podemos definir um número da seqüência
fibonnaci da seguinte maneira:
fib(n)=n se n==0 OU n==1
fib(n)=fib(n-2)+fib(n-1) se n>=2
Prof. Mauricio Wieler Orellana
19
Seqüência de Fibonacci (Implementação)
fib(n)=n se n==0 OU n==1
fib(n)=fib(n-2)+fib(n-1) se n>=2
Múltiplas chamadas recursivas
• Recursão múltipla ocorre quando um método faz
mais de 2 chamadas recursivas.
• Aplicação mais comum: enumerar várias
configurações para resolver um quebra-cabeças
20
Prof. Mauricio
Wieler Orellana
21
Chamada a um método
int x=2, y=3;
Ponto p = new Ponto ();
p.setaCoordenadas (x, y);
p.exibe();
parâmetros
formais
parâmetros
reais
Tipos dos parâmetros reais
devem ser compatíveis com
tipos dos parâmetros formais
Prof. Mauricio
Wieler Orellana
22
Chamada a um método
int x=2, y=3;
Ponto p = new Ponto ();
p.setaCoordenadas (x, y);
p.exibe();
parâmetros
formais
parâmetros
reais
Parâmetros formais são
variáveis locais do método.
Outras variáveis locais podem
ser declaradas (ex: r em
mult).
Prof. Mauricio
Wieler Orellana
23
Chamada a um método
int x=2, y=3;
Ponto p = new Ponto ();
p.setaCoordenadas (x, y);
p.exibe();
parâmetros
formais
parâmetros
reais
Quando execução de uma
chamada termina, execução
retorna ao ponto da chamada.
Profa. Patricia Jaques - Prof. Mauricio Wieler
Orellana
24
Chamada de método
• Quando um método é chamado:
– é necessários inicializar os parâmetros formais com os valores
passados como argumento;
– sistema precisa saber onde reiniciar a execução do programa;
– ...
• Informações de cada método (variáveis e endereço de
retorno) deve ser guardada até o método acabar a sua
execução.
• Mas como o programa diferencia a variável n da primeira
chamada da variável n da segunda chamada do método
fatorialr?
Prof. Mauricio Wieler Orellana
25
Registro de ativação
• Registro de ativação:
– área de memória que guarda o estado de uma função, ou seja:
• variáveis locais
• valores dos parâmetros;
• endereço de retorno (instrução após a chamada do método corrente);
• valor de retorno.
• Registro de ativação são criados em uma pilha em tempo de
execução;
• Existe um registro de ativação (um nó na pilha) para cada
chamada ao método;
• Quando um método é chamado é criado um registro de
ativação para este e este é empilhado na pilha;
• Quando o método finaliza sua execução o registro de ativação
desse método é desalocado.
Prof. Mauricio Wieler Orellana
26
Registro de ativação
Parâmetros e
variáveis locais
Endereço de retorno
Valor de retorno
Parâmetros e
variáveis locais
Endereço de retorno
Valor de retorno
Parâmetros e
variáveis locais
Endereço de retorno
Valor de retorno
...
topo da pilha
Registro de
ativação de
f1()
Registro de
ativação de
f2()
Registro de
ativação de
f3()
Registro de
ativação do
método
main()
Prof. Mauricio Wieler Orellana
27
Registro de ativação: exemplo
resultado
…
n=4
PC = 12
n=3
PC=7
n=2
PC=7
Registro de
ativação de
fat(3)
Registro de
ativação de
fat(2)
Registro de
ativação de
fat(4)
fat (4)  main
n=1
PC=7
Registro de
ativação de
fat(1)
fatorial de 4
1
2
6
24
topo
topo
topo
topo
4*fat(3)
3*fat(2)
2*fat(1)
1
=2
=6
=24
=24
• A cada término de FAT, o controle retorna para a
expressão onde foi feita a chamada na execução
anterior, e o último conjunto de variáveis que foi
alocado é liberado nesse momento. Esse mecanismo
utiliza uma pilha.
• A cada nova chamada do método FAT, um novo
conjunto de variáveis (n, FAT) é alocado.
Prof. Mauricio Wieler Orellana
29
Dicas para desenvolver algoritmos recursivos
• Montar, inicialmente, uma definição (especificação)
recursiva do problema, como segue:
1. Definir pelo menos um caso básico;
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) básico(s).
• Depois, é só traduzir essa especificação para a
linguagem de programação.
Prof. Mauricio Wieler Orellana
30
Vantagens e Desvantagens
• Vantagens da recursão
– Redução do tamanho do código fonte
– Maior clareza do algoritmo para problemas de definição
naturalmente recursiva
• Desvantagens da recursão
– Baixo desempenho na execução devido ao tempo para
gerenciamento das chamadas
– Dificuldade de depuração dos subprogramas recursivos,
principalmente se a recursão for muito profunda

Mais conteúdo relacionado

Mais procurados

Equação de Recorrência - I (Otimização)
Equação de Recorrência - I (Otimização)Equação de Recorrência - I (Otimização)
Equação de Recorrência - I (Otimização)Jedson Guedes
 
Introdução à analise e complexidade de algoritmos
Introdução à analise e complexidade de algoritmosIntrodução à analise e complexidade de algoritmos
Introdução à analise e complexidade de algoritmosNécio de Lima Veras
 
13 introducao a analise de algoritmos
13   introducao a analise de algoritmos13   introducao a analise de algoritmos
13 introducao a analise de algoritmosRicardo Bolanho
 
Ger numaleat(1)
Ger numaleat(1)Ger numaleat(1)
Ger numaleat(1)Iago Lira
 
Logica Algoritmo 08 Recursividade
Logica Algoritmo 08 RecursividadeLogica Algoritmo 08 Recursividade
Logica Algoritmo 08 RecursividadeRegis Magalhães
 
Calculo numerico capitulo 2
Calculo numerico capitulo 2Calculo numerico capitulo 2
Calculo numerico capitulo 2Bruno Mulina
 
Métodos Iterativos - Gauss-Seidel - @professorenan
Métodos Iterativos - Gauss-Seidel - @professorenanMétodos Iterativos - Gauss-Seidel - @professorenan
Métodos Iterativos - Gauss-Seidel - @professorenanRenan Gustavo
 
Relações de recorrência
Relações de recorrênciaRelações de recorrência
Relações de recorrênciaPablo Silva
 
Metódos de Pesquisa em C
Metódos de Pesquisa em CMetódos de Pesquisa em C
Metódos de Pesquisa em Crodolfoeyalana
 
Capítulo4 interpolação
Capítulo4 interpolaçãoCapítulo4 interpolação
Capítulo4 interpolaçãoJADSON SANTOS
 
Análise assintótica
Análise assintóticaAnálise assintótica
Análise assintóticaPablo Silva
 
Introdução ao Cálculo Numérico S06
Introdução ao Cálculo Numérico S06Introdução ao Cálculo Numérico S06
Introdução ao Cálculo Numérico S06Paulo Nascimento
 
Redes neurais com matlab
Redes neurais com matlabRedes neurais com matlab
Redes neurais com matlabRenato Vicente
 

Mais procurados (20)

Equação de Recorrência - I (Otimização)
Equação de Recorrência - I (Otimização)Equação de Recorrência - I (Otimização)
Equação de Recorrência - I (Otimização)
 
Introdução à analise e complexidade de algoritmos
Introdução à analise e complexidade de algoritmosIntrodução à analise e complexidade de algoritmos
Introdução à analise e complexidade de algoritmos
 
0001
00010001
0001
 
000003 complexidade
000003 complexidade000003 complexidade
000003 complexidade
 
13 introducao a analise de algoritmos
13   introducao a analise de algoritmos13   introducao a analise de algoritmos
13 introducao a analise de algoritmos
 
Ger numaleat(1)
Ger numaleat(1)Ger numaleat(1)
Ger numaleat(1)
 
Logica Algoritmo 08 Recursividade
Logica Algoritmo 08 RecursividadeLogica Algoritmo 08 Recursividade
Logica Algoritmo 08 Recursividade
 
Estrutura de dados em Java - Recursividade
Estrutura de dados em Java - RecursividadeEstrutura de dados em Java - Recursividade
Estrutura de dados em Java - Recursividade
 
Calculo numerico capitulo 2
Calculo numerico capitulo 2Calculo numerico capitulo 2
Calculo numerico capitulo 2
 
Max min ime
Max min   imeMax min   ime
Max min ime
 
Métodos Iterativos - Gauss-Seidel - @professorenan
Métodos Iterativos - Gauss-Seidel - @professorenanMétodos Iterativos - Gauss-Seidel - @professorenan
Métodos Iterativos - Gauss-Seidel - @professorenan
 
Relações de recorrência
Relações de recorrênciaRelações de recorrência
Relações de recorrência
 
Slide cn c05 2020.1
Slide cn c05 2020.1Slide cn c05 2020.1
Slide cn c05 2020.1
 
Apostila rpira
Apostila rpiraApostila rpira
Apostila rpira
 
Metódos de Pesquisa em C
Metódos de Pesquisa em CMetódos de Pesquisa em C
Metódos de Pesquisa em C
 
Capítulo4 interpolação
Capítulo4 interpolaçãoCapítulo4 interpolação
Capítulo4 interpolação
 
Análise assintótica
Análise assintóticaAnálise assintótica
Análise assintótica
 
Introdução ao Cálculo Numérico S06
Introdução ao Cálculo Numérico S06Introdução ao Cálculo Numérico S06
Introdução ao Cálculo Numérico S06
 
Math
MathMath
Math
 
Redes neurais com matlab
Redes neurais com matlabRedes neurais com matlab
Redes neurais com matlab
 

Semelhante a Pesquisa e ordenação recursividade

Apresentação recursividade rev2
Apresentação recursividade rev2Apresentação recursividade rev2
Apresentação recursividade rev2Rogerio Oliveira
 
8a. aula -_estrutura_de_controle_de_repeticao_-_while_java
8a. aula -_estrutura_de_controle_de_repeticao_-_while_java8a. aula -_estrutura_de_controle_de_repeticao_-_while_java
8a. aula -_estrutura_de_controle_de_repeticao_-_while_javaMirlem Pereira
 
Programando em python recursao
Programando em python   recursaoProgramando em python   recursao
Programando em python recursaosamuelthiago
 
Linguagem C - Recursão [exercícios]
Linguagem C - Recursão [exercícios]Linguagem C - Recursão [exercícios]
Linguagem C - Recursão [exercícios]Matheus Alves
 
Algoritmos de ordenação
Algoritmos de ordenaçãoAlgoritmos de ordenação
Algoritmos de ordenaçãoJonas Mendonça
 
Análise de Algoritmos - Solução de Recorrências
Análise de Algoritmos - Solução de RecorrênciasAnálise de Algoritmos - Solução de Recorrências
Análise de Algoritmos - Solução de RecorrênciasDelacyr Ferreira
 
Raciocínio Lógico Aplicado a Resolução de Problemas Matemáticos
Raciocínio Lógico Aplicado a Resolução de Problemas MatemáticosRaciocínio Lógico Aplicado a Resolução de Problemas Matemáticos
Raciocínio Lógico Aplicado a Resolução de Problemas MatemáticosAndré Constantino da Silva
 
Tutorial aed iii 007 - algoritmo de ordenação heapsort
Tutorial aed iii   007 - algoritmo de ordenação heapsortTutorial aed iii   007 - algoritmo de ordenação heapsort
Tutorial aed iii 007 - algoritmo de ordenação heapsortFlávio Freitas
 
Aula 2 profmat - Aplicacoes da Inducao
Aula 2   profmat - Aplicacoes da InducaoAula 2   profmat - Aplicacoes da Inducao
Aula 2 profmat - Aplicacoes da InducaoAline Guedes
 
Aula 2 PROFMAT Aplicacoes da Inducao
Aula 2   PROFMAT Aplicacoes da InducaoAula 2   PROFMAT Aplicacoes da Inducao
Aula 2 PROFMAT Aplicacoes da InducaoAline Guedes
 
www.CentroApoio.com - Matemática - Dízima Periódica - Vídeo Aulas
www.CentroApoio.com - Matemática - Dízima Periódica - Vídeo Aulas www.CentroApoio.com - Matemática - Dízima Periódica - Vídeo Aulas
www.CentroApoio.com - Matemática - Dízima Periódica - Vídeo Aulas Vídeo Aulas Apoio
 

Semelhante a Pesquisa e ordenação recursividade (16)

Apresentação recursividade rev2
Apresentação recursividade rev2Apresentação recursividade rev2
Apresentação recursividade rev2
 
8a. aula -_estrutura_de_controle_de_repeticao_-_while_java
8a. aula -_estrutura_de_controle_de_repeticao_-_while_java8a. aula -_estrutura_de_controle_de_repeticao_-_while_java
8a. aula -_estrutura_de_controle_de_repeticao_-_while_java
 
Programando em python recursao
Programando em python   recursaoProgramando em python   recursao
Programando em python recursao
 
Recursão
RecursãoRecursão
Recursão
 
Linguagem C - Recursão [exercícios]
Linguagem C - Recursão [exercícios]Linguagem C - Recursão [exercícios]
Linguagem C - Recursão [exercícios]
 
Algoritmos de ordenação
Algoritmos de ordenaçãoAlgoritmos de ordenação
Algoritmos de ordenação
 
AP5_2013_2.pptx
AP5_2013_2.pptxAP5_2013_2.pptx
AP5_2013_2.pptx
 
Análise de Algoritmos - Solução de Recorrências
Análise de Algoritmos - Solução de RecorrênciasAnálise de Algoritmos - Solução de Recorrências
Análise de Algoritmos - Solução de Recorrências
 
Raciocínio Lógico Aplicado a Resolução de Problemas Matemáticos
Raciocínio Lógico Aplicado a Resolução de Problemas MatemáticosRaciocínio Lógico Aplicado a Resolução de Problemas Matemáticos
Raciocínio Lógico Aplicado a Resolução de Problemas Matemáticos
 
Tutorial aed iii 007 - algoritmo de ordenação heapsort
Tutorial aed iii   007 - algoritmo de ordenação heapsortTutorial aed iii   007 - algoritmo de ordenação heapsort
Tutorial aed iii 007 - algoritmo de ordenação heapsort
 
Aula 2 profmat - Aplicacoes da Inducao
Aula 2   profmat - Aplicacoes da InducaoAula 2   profmat - Aplicacoes da Inducao
Aula 2 profmat - Aplicacoes da Inducao
 
Aula 2 PROFMAT Aplicacoes da Inducao
Aula 2   PROFMAT Aplicacoes da InducaoAula 2   PROFMAT Aplicacoes da Inducao
Aula 2 PROFMAT Aplicacoes da Inducao
 
Aula 3
Aula 3Aula 3
Aula 3
 
Recursividade
RecursividadeRecursividade
Recursividade
 
www.CentroApoio.com - Matemática - Dízima Periódica - Vídeo Aulas
www.CentroApoio.com - Matemática - Dízima Periódica - Vídeo Aulas www.CentroApoio.com - Matemática - Dízima Periódica - Vídeo Aulas
www.CentroApoio.com - Matemática - Dízima Periódica - Vídeo Aulas
 
Visualg
VisualgVisualg
Visualg
 

Pesquisa e ordenação recursividade

  • 1. Recursividade Prof. Mauricio Wieler Orellana mauricioow@gmail.com
  • 2. Recursão • Repetição pode ser obtida de 2 maneiras: – Laços (for, while, etc) – Chamada recursiva de métodos (recursão) • Recursão é uma técnica de programação na qual um método chama a si mesmo.
  • 3. Prof. Mauricio Wieler Orellana 3 Recursividade • Considere por exemplo que queremos definir a operação de multiplicação, em termos da operação mais simples de adição: – Informalmente, multiplicar m por n (onde n não é negativo) é somar m, n vezes: • Solução de problema que realiza operações repetidamente pode ser implementada usando comando de repetição (também chamado de comando iterativo ou comando de iteração).
  • 4. Prof. Mauricio Wieler Orellana 4 Implementação iterativa da multiplicação
  • 5. Prof. Mauricio Wieler Orellana 5 Multiplicação Revursiva • Podemos também implementar a multiplicação de um número m por n somando m com a multiplicação de m por n-1. – m * n = m + (m * (n-1)) – 2*4 = 2 + (2*3) • Estou chamando de novo a operação de multiplicação mas agora para resolver um sub- problema que é parte do anterior.
  • 6. Prof. Mauricio Wieler Orellana 6 • A multiplicação de um número inteiro por outro inteiro maior ou igual a zero pode ser definida recursivamente por indução matemática 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: Recursão é o equivalente em programação da indução matemática que é uma maneira de definir algo em termos de si mesmo.
  • 7. Prof. Mauricio Wieler Orellana 7 Fatorial recursivo • Definição não recursiva (tradicional): N! = 1, para N <= 1. N! = 1 x 2 x 3 x .... x N, para N>0 • Definição recursiva: N! = 1, para N <= 1; N! = N x (N - 1)!, para N > 0.
  • 8. Prof. Mauricio Wieler Orellana 8 Fatorial recursivo • Definição não recursiva (tradicional): N! = 1, para N <=1. N! = 1 x 2 x 3 x .... x N, para N>0 • implementação iterativa:
  • 9. Prof. Mauricio Wieler Orellana 9 Fatorial recursivo Definição recursiva: N! = 1, para N <= 1; N! = N x (N - 1)!, para N > 0. Um método que chama a si mesmo é chamado de método recursivo. Caso base Caso recursivo
  • 10. Prof. Mauricio Wieler Orellana 10 Características dos programas recursivos a) Chama a si mesmo para resolver parte do problema; b) Existe pelo menos um caso básico que é resolvido sem chamar a si mesmo.
  • 11. Recursão Linear • A recursão linear é a forma mais simples de recursão. • O método faz apenas uma chamada recursiva (uma chamada a si mesmo). • Esse tipo de recursão é ú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 Prof. Mauricio Wieler Orellana 11
  • 12. Recursão Linear (Exemplo) • Exemplo: Soma de n inteiros em um array A se n=1 somaLinear=A[0] senão somaLinear = A[n-1]+SomaLinear(A, n-1) Prof. Mauricio Wieler Orellana 12 Algorithm linearSum(A, n): Input: um array A e um inteiro n que contém o tamanho de A 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]
  • 13. Prof. Mauricio Wieler Orellana 13 Recursão Linear (Exemplo) Trace: LinearSum(A,5) LinearSum(A,1) LinearSum(A,2) LinearSum(A,3) LinearSum(A,4) call call call call 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 call return 15 + A[4] = 15 + 5 = 20
  • 14. Exercício 1 • Faça um método recursivo que inverta o conteúdo de uma determinada array. Prof. Mauricio Wieler Orellana 14
  • 15. 15 Invertendo o conteúdo 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 começando no índice i e fianlizando em j if i < j then Swap A[i] and A[ j] ReverseArray(A, i + 1, j - 1) return
  • 16. 16 Definindo argumentos • Ao criar métodos recursivos, é importante definir os métodos de maneira a facilitar a recursão. • Isso algumas vezes requer que definamos alguns parâmetros adicionais a serem passados pelo método recursivo. – Por exemplo, nós definimos o método recursivo como ReverseArray(A, i, j), não como ReverseArray(A). • Uma maneira mais elegante é: – criar um método público com menos argumentos e não recursivo (para as outras classes chamarem) – e um método privado recursivo com os argumentos necessários. método público não recursivo método privado recursivo
  • 17. Usi ng 17 Recursão Binária • Recursão binária ocorre sempre que houver 2 chamadas recursivas para cada caso não básico. • Estas chamadas podem, por exemplo, ser usadas para resolver duas metades do mesmo problema.
  • 18. Prof. Mauricio Wieler Orellana 18 Seqüência de Fibonacci • A seqüência de Fibonacci é a seqüência de inteiros: – 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ... • Cada elemento nessa seqüência é 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 são 0 e 1. • Se partirmos que fib(0)=0 e fib(1)=1 e assim por diante, podemos definir um número da seqüência fibonnaci da seguinte maneira: fib(n)=n se n==0 OU n==1 fib(n)=fib(n-2)+fib(n-1) se n>=2
  • 19. Prof. Mauricio Wieler Orellana 19 Seqüência de Fibonacci (Implementação) fib(n)=n se n==0 OU n==1 fib(n)=fib(n-2)+fib(n-1) se n>=2
  • 20. Múltiplas chamadas recursivas • Recursão múltipla ocorre quando um método faz mais de 2 chamadas recursivas. • Aplicação mais comum: enumerar várias configurações para resolver um quebra-cabeças 20
  • 21. Prof. Mauricio Wieler Orellana 21 Chamada a um método int x=2, y=3; Ponto p = new Ponto (); p.setaCoordenadas (x, y); p.exibe(); parâmetros formais parâmetros reais Tipos dos parâmetros reais devem ser compatíveis com tipos dos parâmetros formais
  • 22. Prof. Mauricio Wieler Orellana 22 Chamada a um método int x=2, y=3; Ponto p = new Ponto (); p.setaCoordenadas (x, y); p.exibe(); parâmetros formais parâmetros reais Parâmetros formais são variáveis locais do método. Outras variáveis locais podem ser declaradas (ex: r em mult).
  • 23. Prof. Mauricio Wieler Orellana 23 Chamada a um método int x=2, y=3; Ponto p = new Ponto (); p.setaCoordenadas (x, y); p.exibe(); parâmetros formais parâmetros reais Quando execução de uma chamada termina, execução retorna ao ponto da chamada.
  • 24. Profa. Patricia Jaques - Prof. Mauricio Wieler Orellana 24 Chamada de método • Quando um método é chamado: – é necessários inicializar os parâmetros formais com os valores passados como argumento; – sistema precisa saber onde reiniciar a execução do programa; – ... • Informações de cada método (variáveis e endereço de retorno) deve ser guardada até o método acabar a sua execução. • Mas como o programa diferencia a variável n da primeira chamada da variável n da segunda chamada do método fatorialr?
  • 25. Prof. Mauricio Wieler Orellana 25 Registro de ativação • Registro de ativação: – área de memória que guarda o estado de uma função, ou seja: • variáveis locais • valores dos parâmetros; • endereço de retorno (instrução após a chamada do método corrente); • valor de retorno. • Registro de ativação são criados em uma pilha em tempo de execução; • Existe um registro de ativação (um nó na pilha) para cada chamada ao método; • Quando um método é chamado é criado um registro de ativação para este e este é empilhado na pilha; • Quando o método finaliza sua execução o registro de ativação desse método é desalocado.
  • 26. Prof. Mauricio Wieler Orellana 26 Registro de ativação Parâmetros e variáveis locais Endereço de retorno Valor de retorno Parâmetros e variáveis locais Endereço de retorno Valor de retorno Parâmetros e variáveis locais Endereço de retorno Valor de retorno ... topo da pilha Registro de ativação de f1() Registro de ativação de f2() Registro de ativação de f3() Registro de ativação do método main()
  • 27. Prof. Mauricio Wieler Orellana 27 Registro de ativação: exemplo resultado … n=4 PC = 12 n=3 PC=7 n=2 PC=7 Registro de ativação de fat(3) Registro de ativação de fat(2) Registro de ativação de fat(4) fat (4)  main n=1 PC=7 Registro de ativação de fat(1) fatorial de 4 1 2 6 24 topo topo topo topo 4*fat(3) 3*fat(2) 2*fat(1) 1 =2 =6 =24 =24
  • 28. • A cada término de FAT, o controle retorna para a expressão onde foi feita a chamada na execução anterior, e o último conjunto de variáveis que foi alocado é liberado nesse momento. Esse mecanismo utiliza uma pilha. • A cada nova chamada do método FAT, um novo conjunto de variáveis (n, FAT) é alocado.
  • 29. Prof. Mauricio Wieler Orellana 29 Dicas para desenvolver algoritmos recursivos • Montar, inicialmente, uma definição (especificação) recursiva do problema, como segue: 1. Definir pelo menos um caso básico; 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) básico(s). • Depois, é só traduzir essa especificação para a linguagem de programação.
  • 30. Prof. Mauricio Wieler Orellana 30 Vantagens e Desvantagens • Vantagens da recursão – Redução do tamanho do código fonte – Maior clareza do algoritmo para problemas de definição naturalmente recursiva • Desvantagens da recursão – Baixo desempenho na execução devido ao tempo para gerenciamento das chamadas – Dificuldade de depuração dos subprogramas recursivos, principalmente se a recursão for muito profunda