Код: Выделить всё
модуль Fibonacci;
использует НИЗКОУР;
тип
Кэш = массив [*] из цел64;
проц & Init*(кэш: Кэш);
нач
кэш := [0, 1]; (* инициализация первых двух чисел *)
кон Init;
проц Fib*(n: цел64; кэш: Кэш): цел64;
перем
i: цел64;
нач
если n < 0 то
СТОП(1); (* недопустимый аргумент *)
всё;
если n < длинаМассива(кэш) то
возврат кэш[n];
всё;
(* вычисляем недостающие значения *)
i := длинаМассива(кэш);
нцПока i <= n делай
кэш := кэш + [кэш[i-2] + кэш[i-1]];
увел(i);
кц;
возврат кэш[n];
кон Fib;
проц Test*;
перем
кэш: Кэш;
i: цел64;
нач
Init(кэш);
нцДля i := 0 до 10 делай
пПиши("Fib(", i, ") = ", Fib(i, кэш), "\n");
кц;
(* повторный вызов — должен быть мгновенным благодаря мемоизации *)
нцДля i := 0 до 10 делай
пПиши("Fib(", i, ") = ", Fib(i, кэш), " (cached)\n");
кц;
кон Test;
кон Fibonacci.