30
Recursividade Inhaúma Neves Ferraz Departamento de Ciência da Computação Universidade Federal Fluminense [email protected]

Recursividade

  • Upload
    deanna

  • View
    34

  • Download
    0

Embed Size (px)

DESCRIPTION

Recursividade. Inhaúma Neves Ferraz Departamento de Ciência da Computação Universidade F ederal Fluminense [email protected]. Objetos e Procedimentos Recursivos. Um objeto é dito recursivo se consiste parcialmente em si mesmo ou é definido em termos de si mesmo. - PowerPoint PPT Presentation

Citation preview

Page 1: Recursividade

Recursividade

Inhaúma Neves Ferraz

Departamento de Ciência da Computação

Universidade Federal Fluminense

[email protected]

Page 2: Recursividade

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

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

4

Chamadas de procedimentos (não recursivos)

Page 5: Recursividade

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

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

7

Chamadas recursivas de funções

Page 8: Recursividade

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

9

Exemplo de Procedimentos Recursivos

Cálculo do fatorial de um inteiro

Série de Fibbonacci

Torres de Hanói

Page 10: Recursividade

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

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

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

Exemplo

Page 14: Recursividade

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

15

Exemplo de uso de pilha

x = n-1y = fact(x)fact(n) = n * y

Page 16: Recursividade

Simulação de Recursão

Page 17: Recursividade

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

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

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

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

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

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

23

Exemplo

Será apresentado um problema clássico de recursão : cálculo do fatorial de um inteiro

Page 24: Recursividade

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

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

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

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

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

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

30

Case Default: retorno final

default: // retorno final {

return (Result);

break;

} //end default

} //end switch

} //end While

}