Recursividade
description
Transcript of Recursividade
![Page 1: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/1.jpg)
Recursividade
Inhaúma Neves Ferraz
Departamento de Ciência da Computação
Universidade Federal Fluminense
![Page 2: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/2.jpg)
2
Objetos e Procedimentos Recursivos
Um objeto é dito recursivo se consiste parcialmente em si mesmo ou é definido em termos de si mesmo.
Procedimentos recursivos podem ser processadas por procedimentos não recursivos simulando a recursão.
![Page 3: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/3.jpg)
3
Eventos que ocorrem no uso de Procedimentos
Na chamada do procedimentoPassagem dos argumentosAlocação e inicialização das variáveis locaisTransferência do controle para a função (endereço de retorno)
No retorno do procedimento
Recuperação do endereço de retornoLiberação da área de dadosDesvio para o endereço de retorno
![Page 4: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/4.jpg)
4
Chamadas de procedimentos (não recursivos)
![Page 5: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/5.jpg)
5
Implementação de procedimentos recursivos
Procedimentos recursivos só podem ser implementados em alto nível de abstração.
As máquinas não executam procedimentos recursivos.
Cabe ao “software” simular procedimentos recursivos.
![Page 6: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/6.jpg)
6
Simulação de Procedimentos Recursivos
A simulação de recursão utilizará uma pilha com os seguintes atributos gravados:Parâmetros
Variáveis
Valor da função (se for o caso)
Endereço de retorno
![Page 7: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/7.jpg)
7
Chamadas recursivas de funções
![Page 8: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/8.jpg)
8
Chamadas recursivas de funções1 2
3
4
5
6
7
8
9
17
11
12
13
14
15
16
10
18
19
![Page 9: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/9.jpg)
9
Exemplo de Procedimentos Recursivos
Cálculo do fatorial de um inteiro
Série de Fibbonacci
Torres de Hanói
![Page 10: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/10.jpg)
10
Cálculo do fatorial de um inteiro
public class Factorial { public static void main(String[] args){ int input = Integer.parseInt(args[0]); double result = factorial(input); System.out.println(result);
} public static double factorial(int x){ if (x<0) return 0.0; else if (x==0) return 1.0; else return x*factorial(x-1); } }
![Page 11: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/11.jpg)
11
Série de Fibonacci
public static int fib(int n){ // Série de Fibonacci de ordem 4 int x,y; if (n <= 1) return 1; else { x = fib(n-1); y = fib(n-2); z = fib(n-3); return x + y + z; }}
![Page 12: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/12.jpg)
12
Torres de HanóiDenote os pinos por A, B, C Seja n o número total de discosNumere os discos de 1 (menor, no topo da pilha) até n (maior, base da pilha)
Para mover n discos do pino A para o pino B:1. Mova n-1 discos de A para C. Isto faz com que o disco n
fique isolado no pino A 2. Mova o disco n de A para B 3. Mova n-1 discos de C para B de maneira que eles fiquem
em cima do disco n
![Page 13: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/13.jpg)
Exemplo
![Page 14: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/14.jpg)
14
Algoritmo do Fatorial
fact(n) = n * fact(n - 1) se n=o então fact(0) = 1 senão x = n-1 y = fact(x)
fact(n) = n * y fim do se
![Page 15: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/15.jpg)
15
Exemplo de uso de pilha
x = n-1y = fact(x)fact(n) = n * y
![Page 16: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/16.jpg)
Simulação de Recursão
![Page 17: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/17.jpg)
17
Programa simulador de recursão (1)
Para criar um programa que simule a recursão deve-se partir do programa recursivo e executar 3 alterações:Alteração inicial
Substituição de cada chamada recursiva por um conjunto de instruções
Substituição de cada retorno da função por um conjunto de instruções
![Page 18: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/18.jpg)
18
Programa simulador de recursão (2)
O programa assim obtido será uma simulação não recursiva do programa recursivo.
Os laços recursivos serão substituídos por laços até obter uma pilha de recursão vazia
Dentro dos laços uma seleção múltipla (switch..case) governa os retornos e desvios do programa
![Page 19: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/19.jpg)
19
Alteração inicial
1. Declarar uma pilha e inicializá-la como vazia 2. Atribuir aos dados correntes os valores
adequados3. Criar uma repetição até obter pilha vazia
contendo uma seleção múltipla cujo parâmetro é o endereço de retorno da recursão
4. O primeiro caso da seleção é a condição de término da recursão
![Page 20: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/20.jpg)
20
Chamadas recursivas
5. Quando os argumentos da chamada do procedimento forem expressões calcular o valor das expressões e atribuir estes valores aos parâmetros formais
6. Empilhar os parâmetros, as variáveis locais e o endereço de retorno i
7. Atualizar os valores dos parâmetros para o prosseguimento do programa
![Page 21: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/21.jpg)
21
Substituição do return
8. Desempilhar os parâmetros, variáveis locais e endereço de retorno
9. Se o procedimento for uma função avaliar as expressões que se seguem ao return e empilhar o resultado
![Page 22: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/22.jpg)
22
Modelos de geração de programas não recursivos simulando programas recursivos
Modelo de alteração inicial
Modelo de chamada recursiva
Modelo de retorno de chamada recursiva
![Page 23: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/23.jpg)
23
Exemplo
Será apresentado um problema clássico de recursão : cálculo do fatorial de um inteiro
![Page 24: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/24.jpg)
24
Fatorial recursivolong int fact(int n){Long int x;long int y;if (n < 0) { printf("parâmetro negativo: %d\n",n); exit(1); } /* end if */ if (n == 0) return (1);x = n-1;y = fact(x);return(n*y);} /* end fact */
![Page 25: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/25.jpg)
25
Elemento da pilha de recursão
class CFactNode
{
private:
//atributos encapsulados
long int value;
long int x;
long int y;
short int retAddr;
![Page 26: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/26.jpg)
26
Alterações iniciais
long int FactSwitch(long int n){
stack<CFactNode> FactStack;long int Result;short int i;short int RetAddr;
CFactNode currNode;
//Empilha termo vazio para desempilhamento no final do processoFactStack.push(CFactNode(0));
//Atribui aos parâmetros e endereço de retorno os valores adequadoscurrNode.setValue(n);currNode.setRetAddr(4);currNode.setX(0);currNode.setY(0);i = 0;
![Page 27: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/27.jpg)
27
Estrutura do programawhile (FactStack.size()) { switch (i) { case 0: // início do procedimento recursivo { if(currNode.getValue()== 0) //caso básico, Saída da Recursão { } else //entrada normal da recursão { } break; } //end case 0 case 1: // retorno da chamada recursiva { break; } //end case 1 default: // retorno final { return (Result); break; } //end default } //end switch } //end While
![Page 28: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/28.jpg)
28
Case 0: início do procedimento
case 0: // início do procedimento recursivo {
if(currNode.getValue()== 0) //caso básico, Saída da Recursão {
Result = 1; i = currNode.getRetAddr(); // para aonde vai currNode = FactStack.top(); FactStack.pop(); //Desempilha i = currNode.getRetAddr(); }else //entrada normal da recursão {
currNode.setX(currNode.getValue() - 1) ; FactStack.push(currNode); //Empilha o currNode
//O novo currNode recebe o Valor n-1 currNode.setValue(currNode.getX()); currNode.setRetAddr(1); //vai para case 1
i = 0; // chamada recursiva } break; } //end case 0
![Page 29: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/29.jpg)
29
Case 1: retorno da chamada recursiva
case 1: // retorno da chamada recursiva { //Parâmetro x recebe o valor de Fact(n-1); currNode.setY(Result); Result = currNode.getValue() * currNode.getY(); i= currNode.getRetAddr(); currNode = FactStack.top(); FactStack.pop(); //chamada recursiva break; } //end case 1
![Page 30: Recursividade](https://reader036.fdocumentos.tips/reader036/viewer/2022062409/568149a2550346895db6e25e/html5/thumbnails/30.jpg)
30
Case Default: retorno final
default: // retorno final {
return (Result);
break;
} //end default
} //end switch
} //end While
}