Professional Documents
Culture Documents
Recurso Indireta
As subrotinas so conectadas atravs de uma cadeia de chamadas sucessivas que acaba retornando primeira que a desencadeou:
Um teste define, a cada momento, se o problema ter soluo trivial ou geral. Em termos matemticos, a recurso uma tcnica que, atravs de substituies sucessivas, reduz o problema a um caso de soluo trivial
FUNCTION fat(n: INTEGER):INTEGER; BEGIN IF n= 0 THEN fat:= 1 ELSE fat:= n * fat (n-1); END;
O objetivo transferir os trs discos da torre A para a torre C, usando a torre B como auxiliar. Somente o primeiro disco de uma torre pode ser deslocado para outra, e um disco maior nunca pode ser colocado sobre outro menor. Processo para transferir os trs discos:
Matematicamente possvel demonstrar que o tempo necessrio para mover n discos da ordem de n! (ou maior).
Quando a chamada Hanoi (3,A,B,C) for executada, ser produzida a seguinte sada: Mova disco 1 da torre A para C Mova disco 2 da torre A para B Mova disco 1 da torre C para B Mova disco 3 da torre A para C Mova disco 1 da torre B para A Mova disco 2 da torre B para C Mova disco 1 da torre A para C
Embora fatorial seja mais eficiente de forma iterativa, um excelente exemplo para se entender o que recurso.
2. Listas Lineares
So estruturas dinmicas caracterizadas por manter uma seqncia ordenada de elementos. So compostas por elementos que podem ser dados primitivos ou estruturados. Os elementos so chamados de nodos. Seja uma lista X, formada por nodos X1,X2, ... Xn, tal que: 1) Existem n nodos na lista (n>=0); 2) X1 o primeiro nodo; 3) Xn o ltimo nodo; 4) Para todo i,j entre 1 e n, se i<j, ento o elemento Xi antecede Xj; 5) Caso i = j -1, Xi o antecessor de Xj e Xj o sucessor de Xi. 6) Quando a lista no possui nodos (n=0) a lista dita vazia. Exemplos de listas: lista de clientes de uma banco, lista de chamada, lista de compras, etc.
Busca
Operao que procura um elemento especfico. A busca pode ser feita de duas formas: ou o elemento identificado por sua posio relativa ou pelo seu contedo.
Dinmica
O programa capaz de criar novas variveis enquanto executa; reas de memria passam a existir durante a execuo do programa; Ideal para uso com listas encadeadas.
Declarao em Pascal:
CONST MAX = 50; SUCESSO = 1; LISTACHEIA = 2; LISTAVAZIA = 3; POSICAOINVALIDA = 4; TYPE Elem = INTEGER; Lista= RECORD total: integer; memo: ARRAY [1..MAX] OF Elem; END;
10
Removendo do Fim:
FUNCTION RetiraFim (VAR l: Lista; VAR no:Elem):BYTE; BEGIN IF l.total = 0 THEN RetiraFim := LISTAVAZIA ELSE BEGIN no := l.memo[l.total]; l.total:= l.total-1; RetiraFim := SUCESSO; END; END;
Removendo do Incio:
FUNCTION RetiraInicio (VAR l: Lista; VAR no: Elem):BYTE; VAR i: integer; BEGIN IF l.total = 0 THEN RetiraInicio := LISTAVAZIA ELSE BEGIN no:=l.memo[1]; l.total:= l.total-1; FOR i:=1 TO l.total DO l.memo[i] := l.memo[i+1]; RetiraInicio := SUCESSO; END; END;
11
Caso incio = 0 e fim = 0 a lista est vazia; Caso incio = 1 e fim = MAX a lista est cheia; Na inicializao o fim e o incio so zerados; Na primeira insero: incio igual a MAX DIV 2 e fim igual a incio; Mesmo assim, pode ser necessria a movimentao.
Pilha: lista linear onde os acessos, inseres e remoes so realizados em um nico extremo. Listas do tipo LIFO (Las-tin Fist-out, ltimo a entrar o primeiro a sair); Fila: lista linear onde as inseres so feitas em um extremo e os acessos e remoes no outro. Listas do tipo FIFO (First-in First-out, primeiro a entrar o primeiro a sair); Fila Dupla ou DEQUE (Double Ended Queue): lista linear onde as inseres, remoes e acessos so feitos em qualquer extremo. Casos especiais: Entrada Restrita e Sada Restrita.
12
Operaes Bsicas:
Inicializa Pilha Insere Pilha (empurra / push) Remove Pilha (puxa / pop) Consulta Topo (top) Vazia (isempty) Cheia (isfull)
13
Registro em Pascal:
CONST MAX = 50; TYPE Elem = CHAR; Pilha= RECORD topo: INTEGER; memo: ARRAY[1..MAX] OF Elem; END;
Inicializando a Pilha:
PROCEDURE Inicializa(VAR p:Pilha); BEGIN p.topo:=0; END;
Verificando Limites:
FUNCTION Vazia(VAR p:Pilha):BOOLEAN; BEGIN IF p.topo=0 THEN Vazia := TRUE ELSE Vazia := FALSE; END; FUNCTION Cheia(VAR p:Pilha):BOOLEAN; BEGIN IF p.topo=MAX THEN Cheia := TRUE ELSE Cheia := FALSE; END;
Empilhando:
PROCEDURE Insere(VAR p:Pilha; no:Elem); BEGIN IF NOT Cheia(P) THEN BEGIN p.topo:=p.topo+1; p.memo[p.topo] := no; END ELSE WRITELN(Pilha Cheia!); {Stack Overflow} END;
Desempilhando:
FUNCTION Remove(VAR p:Pilha):Elem; BEGIN IF NOT Vazia(P) THEN BEGIN Remove:= p.memo[p.topo]; p.topo:=p.topo-1; END ELSE WRITELN(Pilha Vazia!); {Stack Underflow} END;
14
Consulta o Topo:
FUNCTION Topo(VAR p:Pilha):Elem; BEGIN IF NOT Vazia(P) THEN Topo:= p.memo[p.topo] ELSE WRITELN(Pilha Vazia!); END;
Exemplo 2
PROCEDURE DEC2BIN(n:INTEGER); VAR resto, quoc:INTEGER; p:pilha; BEGIN inicializa(p); REPEAT resto:= n MOD 2; insere(P,resto); n := n DIV 2; UNTIL N=0; WHILE NOT vazia(P) DO BEGIN resto := remove(P); WRITE(resto); END; WRITELN; END;
15
Operaes Bsicas:
Inicializa Lista Insere Lista (enfileira / enqueue) Remove Lista (desenfileira / dequeue) Vazia (isempty) Cheia (isfull)
Registro em Pascal:
TYPE Fila= RECORD comeo, fim: INTEGER; memo: ARRAY[1..MAX] OF Elem; END;
16
Problema de Implementao:
Cada vez que um elemento removido, o comeo desloca-se para direita. Aps a remoo de todos os elementos no ser mais possvel inserir na lista.
Registro em Pascal:
CONST MAX= 50; TYPE Elem= REAL; TYPE Fila= RECORD comeco, final, total: INTEGER; memo: ARRAY[1..MAX] OF Elem; END;
Inicializando Fila:
PROCEDURE Inicializa(VAR f:Fila); BEGIN f.total:=0; f.comeco:=1; f.final:=1; END;
17
Verificando Limites:
FUNCTION BEGIN Vazia := END; FUNCTION BEGIN Cheia := END; Vazia(VAR f:Fila):BOOLEAN; (f.total = 0); Cheia(VAR f:Fila):BOOLEAN; (f.total = MAX);
18
TYPE Ponto = RECORD ABCISSA: INTEGER; ORDENADA: INTEGER; END; Elem = PONTO; Ou ento PROCEDURE InsPonto (VAR V:Fila; X,Y:INTEGER); BEGIN insere(V,X); insere(V,Y); END; PROCEDURE RemPonto (VAR V:Fila; VAR X,Y:INTEGER); BEGIN X:=remove(V); Y:=remove(V); END;
19
PROCEDURE Colorir(VAR M:Imagem; X,Y, Cor:INTEGER); VAR V:Fila; C0: INTEGER; BEGIN C0:=M[X,Y]; inicializa(V); InsPonto(V,X,Y); WHILE NOT vazia(V) DO BEGIN RemPonto (V,X,Y); IF M[X+1,Y]=C0 THEN InsPonto(V,X+1,Y); IF M[X-1,Y]=C0 THEN InsPonto(V,X-1,Y); IF M[X,Y+1]=C0 THEN InsPonto(V,X,Y+1); IF M[X,Y-1]=C0 THEN InsPonto(V,X,Y-1); M[X,Y]:=Cor; END; END;
Registro em Pascal
CONST MAX= 50; TYPE Elem= REAL; TYPE Deque= RECORD comeco, final, total: INTEGER; memo: ARRAY[1..MAX] OF Elem; END;
Alm do insere da fila (InsereFinal) e do remove da fila (RemoveIncio) possvel criar o InsereInicio e o RemoveFinal As funes Vazia e Cheia so idnticas
20
Dinmica
O programa capaz de criar novas variveis enquanto executa; reas de memria passam a existir durante a execuo do programa; Ideal para uso com listas encadeadas.
Definio de um ponteiro:
Var nome_do_ponteiro:^tipo_base; Exemplo: VAR pint: ^INTEGER; {aponta
p/ inteiro}
21
Exemplo 2:
VAR n:INTEGER; p:^INTEGER; BEGIN n:= 486; p:= @n; WRITELN(Contedo:,p^); END.
22
23
Declarao em Pascal:
CONST SUCESSO = 1; FALTADEMEMORIA = 2; LISTAVAZIA = 3; TYPE Elem = INTEGER; PtrNodo = ^Nodo; Nodo = RECORD memo: Elem; elo: PtrNodo; END; ListaEnc = ^Nodo;
3.9
24
Removendo do Incio:
PROCEDURE RemoveInicio(VAR l:ListaEnc;VAR no:Elem):BYTE; Var pn : PtrNodo; BEGIN IF l = NIL THEN RemoveInicio:=LISTAVAZIA ELSE BEGIN pn:=l; l:= pn^.elo; no:= pn^.memo; DISPOSE (pn); RemoveInicio:=SUCESSO; END; END;
Removendo do Incio:
PROCEDURE RemoveInicio(VAR l:ListaEnc;VAR no:Elem):BYTE; Var pn : PtrNodo; BEGIN IF l = NIL THEN RemoveInicio:=LISTAVAZIA ELSE BEGIN pn:=l; l:= pn^.elo; no:= pn^.memo; DISPOSE (pn); RemoveInicio:=SUCESSO; END; END;
25
acessar o ltimo elemento da lista, pois, sem empregar o descritor, deve-se visitar todos os elementos intermedirios;
Descritor contm:
endereo do primeiro elemento; endereo do ltimo elemento; quantidade de elementos da lista.
26
27
28
29