A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

1 Aula 6 – Sumário  Revisão da aula anterior  Endereçamento indirecto  Recursividade  Conceito  Exemplos.

Apresentações semelhantes


Apresentação em tema: "1 Aula 6 – Sumário  Revisão da aula anterior  Endereçamento indirecto  Recursividade  Conceito  Exemplos."— Transcrição da apresentação:

1 1 Aula 6 – Sumário  Revisão da aula anterior  Endereçamento indirecto  Recursividade  Conceito  Exemplos

2 2 Processador MAC-1 Revisão – endereçamento indirecto

3 3 Exemplo: copiar vector Implementar um procedimento que copie n elementos de um vector A para um vector B O procedimento deverá receber como argumentos:  O número de elementos a copiar (n)  O endereço do primeiro elemento do vector A (referência)  O endereço do primeiro elemento do vector B (referência)

4 4 Revisão – endereçamento indirecto copia:loco 0 push # int i=0 ciclo:lodl 0 subl 4 jzer fim # i-n == 0? lodl 3 addl 0 pshi # A[i] no topo da pilha lodl 3 addl 1 popi # B[i] = A[i] loco 1 addl 0 stol 0 # i=i+1 jump ciclo fim:insp 1 retn jump main A:6 4 3 5 7 B:0 0 0 0 0 n:5 main:lodd n push loco A push loco B push call copia insp 3 halt A (ref.) B (ref.) End. Ret. i SP Organização da pilha em ‘copia’ n

5 5 Processador MAC-1 Recursividade

6 6  Existem situações em que uma rotina se invoca a si própria  Diz-se que a rotina é recursiva ou recorrente  Soluções recursivas podem ser úteis, simplificando a resolução de alguns problemas, …  … mas é preciso ter cuidado, pois uma solução recursiva causa um maior crescimento da pilha  cada chamada à rotina faz com que sejam colocados dados na pilha (argumentos, endereço de retorno, variáveis locais);  se a rotina se chamar demasiadas vezes a ela própria, a pilha pode ficar sem espaço para crescer (“stack overflow”)

7 7 Programação MAC-1 Exemplo: uma sucessão Implementar uma função que calcule o termo de ordem n da seguinte sucessão, definida de forma recursiva: // Pseudo-código int U(int n) { if (n==1) return 1; return 2*U(n-1) + 1; }

8 8 Programação MAC-1 # int U(int n) U:lodl 1 subd C1 # AC = n-1 jzer ret1 # if n-1==0 return 1 push # call U # U(n-1) insp 1 # push # temp = U(n-1) addl 0 # AC = 2*temp insp 1 # descarta temp addd C1 # AC = 2*U(n-1)+1 retn ret1:loco 1 # AC = 1 retn jump main C1:1 main: loco 4 push call U # U(4) insp 1 halt End. Ret. SP Organização da pilha em ‘U’ n

9 9 Programação MAC-1 Exemplo: números de Fibonacci Fazer uma função que calcule o número de Fibonacci de ordem n. Este é dado por: // Pseudo-código int fibo(int n) { if (n==1 || n==0) return 1; return fibo(n-1) + fibo(n-2); }

10 10 Programação MAC-1 fibo:lodl 1 subd C1 # AC = n-1 jzer ret1 # if n-1==0 return 1 lodl 1 jzer ret1 lodl 1 # subd C2 # push # call fibo # fibo(n-2) insp 1 push # tmp = fibo(n-2) lodl 2 # subd C1 # push # call fibo # F(n-1) insp 1 addl 0 # AC=fibo(n-1)+tmp insp 1 # descarta tmp retn ret1:loco 1 # AC = 1 retn jump main C1:1 C2:2 main: loco 4 push call fibo # fibo(4) insp 1 halt n End. Ret. SP Organização da pilha em ‘fibo’ n End. Ret. SP tmp


Carregar ppt "1 Aula 6 – Sumário  Revisão da aula anterior  Endereçamento indirecto  Recursividade  Conceito  Exemplos."

Apresentações semelhantes


Anúncios Google