]> git.llucax.com Git - z.facultad/75.31/ejercicios.git/blob - 1.9.oz
Ejercicios del capítulo 2.
[z.facultad/75.31/ejercicios.git] / 1.9.oz
1 /****************************************************************************
2 Ejercicio: 1.9b
3 Alumno: Leandro Lucarella
4 Fecha: lun abr  4 01:16:56 ART 2005
5 ****************************************************************************/
6
7 functor
8 import
9     Application
10     System
11 define
12 % Obtenido de internet porque no me funcionaba el {NewStore}
13 % (http://www.info.ucl.ac.be/people/PVR/ds/booksuppl.oz)
14 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
15 % The memory store as used in the exercises
16 fun {NewStore}
17    D={NewDictionary}
18    C={NewCell 0}
19    proc {Put K X}
20       if {Not {Dictionary.member D K}} then
21          C:=@C+1
22       end
23       D.K:=X
24    end
25    fun {Get K} D.K end
26    fun {Size} @C end
27 in
28    storeobject(put:Put get:Get size:Size)
29 end
30 proc {Put S K X} {S.put K X} end
31 fun {Get S K} {S.get K} end
32 fun {Size S} {S.size} end
33 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
34     % Concatena un 0 al final de la lista
35     fun {ShiftLeft L}
36         case L of H|T then
37             H|{ShiftLeft T}
38         else [0] end
39     end
40     % Inserta un 0 al inicio de la lista
41     fun {ShiftRight L} 0|L end
42     % Aplica una operación entre 2 elementos de dos listas
43     fun {OpList Op L1 L2}
44         case L1 of H1|T1 then
45             case L2 of H2|T2 then
46                 {Op H1 H2}|{OpList Op T1 T2}
47             end
48         else nil end
49     end
50     % Calcula variaciones del Triánculo de Pascal
51     fun {GenericPascal Op N}
52         if N == 1 then [1]
53         else L in
54             L = {GenericPascal Op N-1}
55             {OpList Op {ShiftLeft L} {ShiftRight L}}
56         end
57     end
58     % Suma
59     fun {Sum X Y} X+Y end
60     % Celda para almacenar cantidad de veces que se llama al FastPascal
61     S = {NewStore}
62     % Funcion con "memoria"
63     fun {FasterPascal N}
64         if N > {Size S} then
65             if N > 1 then % Si tenemos que calcular anteriores
66                 % Tengo que hacer un local porque si no lo asigno como una
67                 % variable al resultado de la función, lo toma como el retorno
68                 % de la actual y da error de aridad.
69                 local DUMMY in DUMMY = {FasterPascal N-1} end
70             end
71             {Put S N {GenericPascal Sum N}}
72         end
73         {Get S N}
74     end
75     {System.show {FasterPascal 10}}
76     {Application.exit 0}
77 end
78
79 % vim: set et sw=4 sts=4 filetype=oz :