Recursividade Aula 9 Em matemtica vrios objetos so definidos - - PowerPoint PPT Presentation

recursividade
SMART_READER_LITE
LIVE PREVIEW

Recursividade Aula 9 Em matemtica vrios objetos so definidos - - PowerPoint PPT Presentation

Recursividade Aula 9 Em matemtica vrios objetos so definidos apresentando-se um processo que os produz. Ex PI (circunferncia/dimetro) Outra definio de um objeto por um processo o fatorial de um nmero


slide-1
SLIDE 1

Recursividade

Aula 9

slide-2
SLIDE 2

Em matemática vários objetos são definidos

apresentando-se um processo que

  • s

produz.

Ex PI (circunferência/diâmetro) Outra definição de um objeto por um

processo é o fatorial de um número

slide-3
SLIDE 3

Fatorial(n) ou n! = n*(n-1)*(n-2)...(2)*1 se n >0 =1 se n==0 Se formulamos: 0! = 0 1! = 1 2! = 2 * 1 3! = 3 * 2 * 1 4! = 4 * 3 * 2 * 1 Não é possível listar a fórmula para fatorial de cada

inteiro

slide-4
SLIDE 4

Para evitar qualquer abreviatura e um cjto infinito de

definições poderemos apresentar um algoritmo que aceite um número inteiro n e retorne n! prod = 1; for (x = n; x > 0; x--) prod *= x; return prod; ALGORITMO ITERATIVO: Requer de repetição explícita até uma condição ser satisfeita.

slide-5
SLIDE 5

Um algoritmo pode ser considerado “Um

programa ideal” sem quaisquer limitações práticas de um computador real e portanto pode ser usado para definir uma função matemática, entretanto uma função de C não serve como definição matemática da função fatorial por causa de limitações como precisão e tamanho finito de uma máquina real.

slide-6
SLIDE 6

Examinemos detalhadamente a definição de n! que

lista uma fórmula separada para cada valor de n

Ex 4! = 4 * 3 * 2 * 1 isso é igual a 4 * 3! Para todo n>0 verificamos que

n! = n* (n-1)!

Podemos definir:

0! = 1 1! = 1 * 0! 2! = 2 * 1! 3! = 3 * 2! 4! = 4 * 3! 5! = 5 * 4!

slide-7
SLIDE 7

Se empregamos uma notação matemática temos

que

n! = 1 se n == 0 n! = n * (n - 1)! se n >0 Definição de uma função em termos de se mesma,

aparentemente circular.

Método conciso de escrever um número infinito de

equações necessárias para definir n!

Definição RECURSIVA

slide-8
SLIDE 8

A recursividade pode ser utilizada quando um

problema puder ser definido em termos de si próprio.

Por exemplo, quando um objeto é colocado entre

dois espelhos planos paralelos e frente a frente surge uma imagem recursiva, porque a imagem do

  • bjeto refletida num espelho passa a ser o objeto a

ser refletido no

  • utro

espelho e, assim, sucessivamente.

Uma função recursiva chama ela mesma, mas com

  • utros parâmetros.
slide-9
SLIDE 9

Algoritmos Recursivos

A idéia básica de um algoritmo recursivo consiste em

diminuir sucessivamente o problema em um problema menor ou mais simples, até que o tamanho ou a simplicidade do problema reduzido permita resolvê-lo de forma direta, sem recorrer a si mesmo.

Quando isso ocorre, diz que o algoritmo atingiu uma

condição de parada, a qual deve estar presente em pelo menos um local dentro algoritmo.

Sem esta condição o algoritmo não pára de chamar a si

mesmo, até estourar a capacidade da pilha de execução, o que geralmente causa efeitos colaterais e até mesmo o término indesejável do programa.

slide-10
SLIDE 10

Componentes de um algoritmo recursivo

Condição de parada, quando a parte do

problema pode ser resolvida diretamente, sem chamar de novo a função recursiva.

Outros comandos que resolvem uma parte

do problema (chamando novamente a função recursiva);

slide-11
SLIDE 11

Algoritmos Recursivos

f1(..) ...

... ... chama f1(..) ... ... fim f1(..) ... ... ... condição de parada! f1(..) ... ... chama f1(..) ... ...

slide-12
SLIDE 12

1.

5! = 5 * 4!

2.

4! = 4 * 3!

3.

3! = 3 * 2!

4.

2! = 2 * 1!

5.

1! = 1 * 0!

6.

0! = 1 Cada caso é reduzido a um caso mais simples até chegarmos ao caso 0! Que é definido imediatamente como 1

slide-13
SLIDE 13

Se voltarmos 6’ 0! = 1 5’ 1! = 1 * 0! = 1 * 1 = 1 4’ 2! = 2 * 1! = 2 * 1 = 2 3’ 3! = 3 * 2! = 3 * 2 = 6 2’ 4! = 4 * 3! = 4 * 6 = 24 1’ 5! = 5 * 4! = 5 * 24 = 120

slide-14
SLIDE 14

Se levamos esse processo a um algoritmos

teremos

if (n == 0) fact = 1; else { x = n -1; ache o valor de x!. Chame-o de y; fact = n * y;}

Definição recursiva do processo do cálculo do fatorial

slide-15
SLIDE 15

int main(void) { int NUMERO, RESULTADO; scanf("%d", &NUMERO); RESULTADO = FAT(NUMERO); printf("%d\n", RESULTADO); } int FAT(int N) { int AUX; if(N == 0) // condição de parada return 1; AUX = N * FAT(N - 1); return AUX; }

LEMBRE-SE!! N é variável local da função FAT. É melhor a definição recursiva de fatorial?

slide-16
SLIDE 16

Programa principal:

main

NUMERO = 2

RESULTADO = FAT(2)

Função FAT:

PRIMEIRA CHAMADA

N = 2

AUX = 2 * FAT(1)

1

slide-17
SLIDE 17

Função FAT: PRIMEIRA CHAMADA N = 2 AUX = 2 * FAT(1) Função FAT: SEGUNDA CHAMADA N = 1 AUX = 1 * FAT(0)

1 2

slide-18
SLIDE 18

Função FAT: SEGUNDA CHAMADA N = 1 AUX = 1 * FAT(0) Função FAT: TERCEIRA CHAMADA N = 0 condição de parada atingida!!! if (N = = 0) return 1;

2 3

slide-19
SLIDE 19

Função FAT: SEGUNDA CHAMADA N = 1 AUX = 1 * FAT(0) AUX = 1 Função FAT: TERCEIRA CHAMADA N = 0 condição de parada atingida!!! if (N = = 0) return 1; 1

2 3

slide-20
SLIDE 20

Função FAT: PRIMEIRA CHAMADA N = 2 AUX = 2 * FAT(1) AUX = 2 Função FAT: SEGUNDA CHAMADA N = 1 AUX = 1 * FAT(0) AUX = 1 1 1

2 1

slide-21
SLIDE 21

Programa principal: main NUMERO = 2 RESULTADO = FAT(2) RESULTADO = 2 Função FAT: PRIMEIRA CHAMADA N = 2 AUX = 2 * FAT(1) AUX = 2 2 2

1

slide-22
SLIDE 22

Problemas associados a recursividade

! "

  • "
  • # $

% !

slide-23
SLIDE 23

Multiplicação de números naturais

Outro exemplo de definição recursiva O produto A*B em que a e b são inteiros

positivos pode ser definido como A somado a se mesmo b vezes. Essa definição é ITERATIVA

Definição recursiva

a * b = a se b == 1 a * b = a * (b - 1) + a se b > 1

slide-24
SLIDE 24

Exemplo:

6 * 3 = 6 * 2 + 6 = 6 * 1 + 6 + 6 = 6 + 6 + 6 = 18 Exercício: Converter num algoritmo recursivo. Observe padrão de definições recursivas (caso simples e avaliação de casos mais simples) Por que não podemos usar definições como ?? n! = (n + 1)! / (n + 1) a * b = a * (b + 1) - a

slide-25
SLIDE 25

A seqüência de Fibonacci

Seqüência de inteiros do tipo 0, 1, 2, 2, 3, 5, 8, 13, 21, 34 Cada elemento da seqüência é a soma dos dois

elementos anteriores. Se permitimos que fib(0) = 0 e fib(1) = 1

fib(n) = n se n == 0 ou n == 1 fib(n) = fib(n-2) + fib(n-1) se n >= 2 Que diferencia a definição da seqüência de

Fibonacci da do fatorial e da multiplicação dos números naturais??

slide-26
SLIDE 26

A seqüência de Fibonacci

Note que: fib(6) = fib(5) + fib(4)

  • = fib(4) + fib(3) + fib(3) + fib(2)
  • = fib(3) + fib(2) + fib(3) + fib(3) + fib(2)

E assim por diante. Que tem de errado??????

Seria mais eficiente lembrar quanto é fib(3) na primeira vez que ele for chamado

slide-27
SLIDE 27

Solução iterativa:

if (n <= 1) return(n); lofib = 0; hifib = 1; for (i = 2; i <= n; i++) { x = lofib; lofib = hifib; hifib = x + lofib; } return hifib;

slide-28
SLIDE 28

Solução recursiva

slide-29
SLIDE 29

FIB(5)

slide-30
SLIDE 30

FIB(5) FIB(3) FIB(4)

slide-31
SLIDE 31

FIB(5) FIB(3) FIB(4) FIB(3) FIB(2)

slide-32
SLIDE 32

FIB(5) FIB(3) FIB(4) FIB(3) FIB(2) FIB(2) FIB(1)

slide-33
SLIDE 33

FIB(5) FIB(3) FIB(4) FIB(3) FIB(2) FIB(2) FIB(1) FIB(1) FIB(2)

slide-34
SLIDE 34

FIB(5) FIB(3) FIB(4) FIB(3) FIB(2) FIB(2) FIB(1) FIB(1) 1

slide-35
SLIDE 35

FIB(5) FIB(3) FIB(4) FIB(3) FIB(2) FIB(2) FIB(1) 1 1

slide-36
SLIDE 36

FIB(5) FIB(3) FIB(4) 2 FIB(2) FIB(2) FIB(1) 1 1

slide-37
SLIDE 37

FIB(5) FIB(3) FIB(4) 2 FIB(2) FIB(1) 1 1 1

slide-38
SLIDE 38

FIB(5) FIB(3) FIB(4) 2 FIB(1) 1 1 1 1

slide-39
SLIDE 39

FIB(5) FIB(3) FIB(4) 2 1 1 1 1 1

slide-40
SLIDE 40

FIB(5) FIB(3) 3 2 1 1 1 1 1

slide-41
SLIDE 41

2 3 2 1 1 1 1 1 FIB(5)

slide-42
SLIDE 42

5 2 3 2 1 1 1 1 1

Resposta: O 5º termo da série é 5.

slide-43
SLIDE 43

Torres de Hanoi

Problema criado pelo matemático francês Edouard

Lucas, em 1883;

3 torres; x discos de vários tamanhos na primeira torre; Objetivo: transportar os discos, 1 a 1, para a terceira

torre;

Regras:

nunca colocar um disco maior sobre um disco menor; pode-se mover um único disco por vez; nunca colocar um disco noutro lugar que não numa das

três hastes.

slide-44
SLIDE 44

Torres de Hanoi

slide-45
SLIDE 45

Torres de Hanoi

Lucas também criou uma “lenda” que dizia que em

Benares, durante o reinado do imperador Fo Hi, existia um templo que marcaria o centro do

  • universo. Dentro deste templo, alguns monges

moviam discos de ouro entre 3 torres de diamante. Deus colocou 64 discos de ouro em uma das torres na hora da criação do universo. Diz-se que, quando

  • s monges completarem a tarefa de transportar

todos os discos para a terceira torre, o universo terminará.

(como vai levar pelo menos 264 - 1 movimentos para

completar a tarefa, estamos a salvo por enquanto. Assumindo que os monges realizem 1 movimento por segundo, e não cometam erros, eles irão levar um total de 585,000,000,000 anos.)

slide-46
SLIDE 46

Como resolver?

Sejam 4 discos na torre 1. Problema principal: Mover 4 discos da torre 1

para a torre 3.

slide-47
SLIDE 47

Recursão!

Mover 4 discos da torre 1 para a torre 3:

mover 3 discos da torre 1 para a torre 2; mover 1 disco da torre 1 para a torre 3; mover 3 discos da torre 2 para a torre 3.

slide-48
SLIDE 48

Recursão!

Mover 4 discos da torre 1 para a torre 3:

  • mover 3 discos da torre 1 para a torre 2;
  • mover 1 disco da torre 1 para a torre 3;
  • mover 3 discos da torre 2 para a torre 3.
slide-49
SLIDE 49

Recursão!

Mover 4 discos da torre 1 para a torre 3:

  • mover 3 discos da torre 1 para a torre 2;
  • mover 1 disco da torre 1 para a torre 3;
  • mover 3 discos da torre 2 para a torre 3.
slide-50
SLIDE 50

Recursão!

Mover 4 discos da torre 1 para a torre 3:

  • mover 3 discos da torre 1 para a torre 2;
  • mover 1 disco da torre 1 para a torre 3;
  • mover 3 discos da torre 2 para a torre 3.
slide-51
SLIDE 51

Divisão do problema

Logo o problema principal:

Mover 4 discos da torre 1 para a torre 3

Se transforma em um problema menor:

mover 3 discos da torre 1 para a torre 2; mover 1 disco da torre 1 para a torre 3; mover 3 discos da torre 2 para a torre 3.

Mas, como mover 3 discos?

slide-52
SLIDE 52

Divisão do problema

Mover 3 discos da torre 1 para a torre 2:

mover 2 discos da torre 1 para a torre 3; mover 1 disco da torre 1 para a torre 2; mover 2 discos da torre 3 para a torre 2.

slide-53
SLIDE 53

Divisão do problema

Mover 3 discos da torre 1 para a torre 2:

  • mover 2 discos da torre 1 para a torre 3;
  • mover 1 disco da torre 1 para a torre 2;
  • mover 2 discos da torre 3 para a torre 2.
slide-54
SLIDE 54

Divisão do problema

Mover 3 discos da torre 1 para a torre 2:

  • mover 2 discos da torre 1 para a torre 3;
  • mover 1 disco da torre 1 para a torre 2;
  • mover 2 discos da torre 3 para a torre 2.
slide-55
SLIDE 55

Divisão do problema

Mover 3 discos da torre 1 para a torre 2:

  • mover 2 discos da torre 1 para a torre 3;
  • mover 1 disco da torre 1 para a torre 2;
  • mover 2 discos da torre 3 para a torre 2.
slide-56
SLIDE 56

Algoritmo

Mover x discos, da torre a para a torre b:

mover (x-1) discos, da torre a para a torre c mover 1 disco da torre a para a torre b mover (x-1) discos, da torre c para a torre b

Função de parada:

Se o número de discos = 1, move direto.

slide-57
SLIDE 57

Observações

Sejam 3 torres, com os números 1, 2 e 3. Dadas 2 torres, como descobrir qual a

terceira?

Isto é, dadas as torres 1 e 3, como descobrir

que a outra torre é a 2?

Dadas as torres 2 e 3, como descobrir que a

  • utra torre é a 1?
slide-58
SLIDE 58

Observação

Note: 1 + 2 + 3 = 6 Logo: A outra torre é

6 - (soma das torres indicadas)

Exemplos:

torres 1 e 2

Outra torre: 6 - (1 + 2) = 6 - 3 = 3

torres 2 e 3

Outra torre: 6 - (2 + 3) = 6 - 5 = 1

slide-59
SLIDE 59

Solução

void HANOI(int ND, int DE, int PARA) { int OUTRA_TORRE = 6 - (DE + PARA); if(ND == 1) { printf("Mover disco da torre %d para a torre %d.\n", DE, PARA); return; } HANOI(ND-1, DE, OUTRA_TORRE); HANOI(1, DE, PARA); HANOI(ND-1, OUTRA_TORRE, PARA); return; }

slide-60
SLIDE 60

Solução

Digite o numero de discos: 4 Mover disco da torre 1 para a torre 2. Mover disco da torre 1 para a torre 3. Mover disco da torre 2 para a torre 3. Mover disco da torre 1 para a torre 2. Mover disco da torre 3 para a torre 1. Mover disco da torre 3 para a torre 2. Mover disco da torre 1 para a torre 2. Mover disco da torre 1 para a torre 3. Mover disco da torre 2 para a torre 3. Mover disco da torre 2 para a torre 1. Mover disco da torre 3 para a torre 1. Mover disco da torre 2 para a torre 3. Mover disco da torre 1 para a torre 2. Mover disco da torre 1 para a torre 3. Mover disco da torre 2 para a torre 3. Pressione qualquer tecla para continuar . . .

slide-61
SLIDE 61

Mover disco da torre 1 para a torre 2.

slide-62
SLIDE 62

Mover disco da torre 1 para a torre 3.

slide-63
SLIDE 63

Mover disco da torre 2 para a torre 3.

slide-64
SLIDE 64

Mover disco da torre 1 para a torre 2.

slide-65
SLIDE 65

Mover disco da torre 3 para a torre 1.

slide-66
SLIDE 66

Mover disco da torre 3 para a torre 2.

slide-67
SLIDE 67

Mover disco da torre 1 para a torre 2.

slide-68
SLIDE 68

Mover disco da torre 1 para a torre 3.

slide-69
SLIDE 69

Mover disco da torre 2 para a torre 3.

slide-70
SLIDE 70

Mover disco da torre 2 para a torre 1.

slide-71
SLIDE 71

Mover disco da torre 3 para a torre 1.

slide-72
SLIDE 72

Mover disco da torre 2 para a torre 3.

slide-73
SLIDE 73

Mover disco da torre 1 para a torre 2.

slide-74
SLIDE 74

Mover disco da torre 1 para a torre 3.

slide-75
SLIDE 75

Existem linguagens de programação que não

suportam recursividade como FORTAM, COBOL e muitos linguagens de máquina

Porem soluções recursivas podem ser simuladas se

entendermos o conceito e funcionamento da recursividade

Não é raro que um programador consiga enunciar

uma solução recursiva para um problema, as vezes a solução recursiva é a mais natural e simples porem as soluções recursivas são com freqüência mais dispendiosas que a solução não recursiva.

slide-76
SLIDE 76

Em geral uma solução não recursiva de um programa executará

com mais eficiência em termos de espaço e tempo, isso acontece porque a solução não recursiva evita o trabalho extra de entrar e sair de um bloco e o empilhamento de desnecessário de variáveis

Contudo verificaremos que a solução recursiva é as vezes o

método mais natural e lógico de desenvolver como é o caso das torres de Hanoi e menos propenso a erros

Conflito EFICIENCIA DA MAQUINA X EFICIENCIA DO

PROGRAMADOR

Nestes casos versões simuladas dos casos recursivos é uma

excelente solução

slide-77
SLIDE 77
  • Que acontece quando uma função é chamada??

1.

Passar argumentos: Para um parâmetro em C uma copia é criada localmente dentro da função e quaisquer mudança e feita nessa copia local. O

  • riginal não é alterado

2.

Alocar e inicializar variáveis locais: Depois que os argumentos forem passados as variáveis locais da função serão alocadas. As diretamente declaradas na função e as temporais

3.

Transferir o controle para a função: Deve ser passado o endereço de retorno como parâmetro

slide-78
SLIDE 78
  • Quando retorna que acontece?

1.

O endereço de retorno é recuperado e armazenado num logar seguro

2.

A área de dados da função é liberada

3.

Usa-se um desvio para o endereço de retorno salvo anteriormente, deve também salvar se os valores de retorno para que o chamador possa recuperar esse valor.

slide-79
SLIDE 79

Chamada de b Chamada de c Endereço de retorno Chamada de d Endereço de retorno Endereço de retorno controle Programa principal Procedimento b Procedimento c Procedimento d Chamada de b Chamada de c Endereço de retorno Chamada de d Endereço de retorno controle Programa principal Procedimento b Procedimento c

slide-80
SLIDE 80

Observe que a seqüência de endereços de retorno

forma uma pilha isto é o mais recente endereço de retorno a ser incluído na cadeia é o primeiro a ser

  • removido. Em qualquer ponto só

poderemos acessar o endereço de retorno a partir da função atualmente em execução que representa o topo da

  • pilha. Quando uma pilha é esvaziada (isto é quando

a função retornar) será revelado um novo topo dentro da rotina de chamadas.

Chamar uma função tem o efeito de incluir um

elemento numa pilha e retornar da função de eliminá-lo

slide-81
SLIDE 81

Cada vez que uma função recursiva chama a

si mesma uma área de dados totalmente nova para essa chamada precisa ser alocada. Essa área contem todos

  • s

parâmetros variáveis locais temporárias e endereços de retorno. Todo retorno acareia a liberação da atual área de dados. Sugere-se

  • uso de uma pilha
slide-82
SLIDE 82

Poderemos usar uma estrutura do tipo

#define MAXSTACK 50; struct stack{ int top; struct dataarea item[MAXSTACK] }

slide-83
SLIDE 83

Passos da conversão Desenvolver caso recursivo Desenvolver simulação com todas as pilhas e

temporários

Eliminar todas as pilhas e variáveis supérfluas Quando uma pilha não pode ser eliminada da

versão não recursiva e quando a versão recursiva não contem nenhum dos parâmetros adicionais o variáveis locais, a versão recursiva pode ser tão o mais veloz que a não recursiva sob um compilador eficiente. Exemplo Torres de Hanoi

slide-84
SLIDE 84

O

fatorial que não precisa pilha na implementação não recursiva e a geração de números de fibonacci onde temos uma chamada desnecessária e também não precisa de pilha a solução recursiva deve ser evitada na pratica

Até onde uma solução recursiva pode ser

transformada em direta dependerá do problema e a engenhosidade do programador

slide-85
SLIDE 85

Simulação de Recursividade

struct stack { int top; struct dataarea item[MAXSTACK]; }; void popsub(struct stack *s, struct dataarea *a){ *a = s->item[s->top]; s->top--; } void push(struct stack *s, struct dataarea *a){ s->top++; s->item[s->top] = *a; }

slide-86
SLIDE 86

Simulação de Recursividade

int fact(int n){ int x, y; if (n==0) return(1); x = n-1; y = fact(x); return (n * y); }

Ponto 2 para retornar (label1: return(result);) Ponto 1 para retornar (labe2 y = result;)

slide-87
SLIDE 87

Simulação de Recursividade

struct dataarea{ int param; //parametro simulado (n) int x; //variaveis atuais da chamada long int y; short int retaddr; //endereço de retorno (1 ou 2) }; switch(i){ case 1: goto label1; //retorno ao prg principal case 2: goto label2; //simulando à atribuição do valor //retornado à variavel y na execução //anterior de fact }

slide-88
SLIDE 88

Simulação de Recursividade

//retorno a partir de fact result = valor a ser retornado; i = currarea.retaddr; popsub(&s, &currarea); switch(i){ case 1: goto label1; case 2: goto label2; }

slide-89
SLIDE 89

Simulação de Recursividade

//chamada introduz a atual área na pilha //atualiza os valores dos parâmetros e //transfere o controle para o inicio da rotina push(&s, &currarea); currarea.param = currarea.x; currarea.retaddr = 2; goto start;

slide-90
SLIDE 90

long int simfact(int n){ struct dataarea currarea; struct stack s; short i; long int result; s.top = -1; currarea.param = 0; currarea.x = 0; currarea.y = 0; currarea.retaddr = 0; push (&s, &currarea); currarea.param = n; currarea.retaddr = 1; start: if (currarea.param ==0){ result = 1; i = currarea.retaddr; popsub(&s, &currarea); switch(i){ case 1: goto label1; case 2: goto label2; } } currarea.x = currarea.param -1; push(&s, &currarea); currarea.param = currarea.x; currarea.retaddr = 2; goto start; label2: currarea.y = result; result = currarea.param*currarea.y; i = currarea.retaddr; popsub(&s, &currarea); switch(i){ case 1: goto label1; case 2: goto label2; } label1: return result; }

slide-91
SLIDE 91

Simulação de Recursividade

São necessárias todas as variáveis temporais? (n,

x, y)

n necessita ser empilhada (y=n*fact(x);) Embora x seja definida na chamada nunca será

usada depois de retornar (se x e y não fossem declaradas na função e sim globais, a rotina funcionaria igualmente bem.

x e y não precisam ser empilhadas E o endereço de retorno?? Só existe um endereço

de retorno importante (fact), mas se não empilhamos a area de dados artificial UNDERFLOW

Podemos fazer popandtest...

slide-92
SLIDE 92

#include<stdio.h> #include<stdlib.h> #define MAXSTACK 50 struct stack { int top; int param[MAXSTACK]; }; int empty(struct stack *s){ return (s->top == -1); } void popandtest(struct stack *s, int *a, short int *und){ if (!empty(s)){ und = 0; *a = s->param[s->top]; s->top--; return; } *und = 1; } void push(struct stack *s, int *a){ s->top++; s->param[s->top] = *a; }

slide-93
SLIDE 93

label2: y = result; result = currparam*y; popandtest(&s, &currparam, &und); switch(und){ case 1: goto label1; case 0: goto label2; } label1: return(result); } int simfact1(int n){ struct stack s; short int und; long int result, y; int currparam, x; s.top = -1; currparam = n; start: if (currparam == 0){ result = 1; popandtest(&s, &currparam, &und); switch(und){ case 0: goto label2; case 1: goto label1; } } x = currparam -1; push(&s, &currparam); currparam = x; goto start;

slide-94
SLIDE 94

Simulação de Recursividade

As instruções goto start e goto label2;

?????? Repetições de código

Para currparam == 0 e currparam != 0

popandtest(&s, &currparam, &und); switch(und){ case 0: goto label2; case 1: goto label1; }

slide-95
SLIDE 95

int simfact2(int n){ struct stack s; short int und; long int y; int x; s.top = -1; x = n; start: if (x == 0) y = 1; else{ push(&s, x--); goto start; } label1: popandtest(&s, &x, &und); if(und == 1) return(y); label2: y*=x; goto label1; } Repetição normal Repetição normal

slide-96
SLIDE 96

int simfact3(int n){ struct stack s; short int und; long int y; int x; s.top = -1; x = n; start: while (x!=0) push(&s, x--); y = 1; popandtest(&s, &x, &und); label1: while (und == 0){ y*=x; popandtest(&s, &x, &und); } return (y); }

slide-97
SLIDE 97

int simfact4(int n){ long int y; int x; for(y=x=1; x<=n; x++) y*=x; return (y); }