Компьютерная математика и пакет Maple

         

Ключи в процедурах



Ключи в процедурах

В объявление процедуры можно включить ключевые слова, вводимые словом

options opseq

Иногда их называют расширяющими ключами. Предусмотрены следующие ключи:

  •  arrow — определят процедуру -оператор в нотации ->;
  •  bulltin — определяет функцию как встроенную;
  •  call_external — задает обращение к внешним программным модулям;
  •  copyright — защищает процедуру от копирования;
  •  inline — определяет процедуру как подчиненную (возможно, не для всех процедур - см. справку); 
  •  load=memberName — загружает нужный для определений процедуры модуль (см. также опцию unload и детали в справке); 
  •  operator — объявляет процедуру — функциональный оператор;
  •  system — определяет процедуру как системную,


  •  remember — определяет таблицу памяти для процедуры;
  •  trace — задает трассировку процедуры;
  •  unl oacNnemberName — выгружает нужный для определения процедуры модуль (см. опцию load).

Ключ remember

Ключ remember обеспечивает занесение результатов обращений к процедуре в таблицу памяти, которая используется при исполнении процедуры. Функция ор позволяет вывести таблицу:

> f:=proc(x) options remember; х^3 end: 

> f(2):

8

> f(3):

27

> op(4,eval(f)): table([2 = 8, 3 = 27]) ,

Ключ remember особенно полезен при реализации итерационных процедур. К примеру, в приведенной ниже процедуре (без использования ключа remember) время вычисления n-го числа Фибоначчи растет пропорционально квадрату n: 

> f:=proc(n) if n<2 then n else f(n-l)+f(n-2) fi end;

 f:=proc(w)if n <2 then и else f(n - l) + ft>-2)endif endproc 

> time(f(30)): 27.400 

> f(30): 832040

Вычисление f(30) по этой процедуре на ПК с процессором Pentium II 350 МГц занимает около 30 с — см. контроль этого времени с помощью функции time (результат в секундах).

Стоит добавить в процедуру ключ remember, и время вычислений резко уменьшится:

> restart;

> fe:-proc(n) options remember: if n<2 then n else fe(n-l)+fe(n-2) fi end: 

> fe(30);

832040

> time(fe(30)); 

0.

При этом вычисление fe(30) происходит практически мгновенно, так как все промежуточные результаты в первом случае вычисляются заново, а во втором они берутся из таблицы. Однако это справедливо лишь тогда, когда к процедуре было хотя бы однократное обращение. Обратите внимание на то, что данные процедуры являются рекурсивными — в их теле имеется обращение к самим себе.

Ключ builtin

Ключ builtin придает процедуре статус встроенной. Он должен использоваться всегда первым. С помощью функции eval(name) можно проверить, является ли функция с именем name встроенной:

> eval(type);

proc() option builtin; 268 end proc 

> eval(print);

proc() option builtin; 229 end proc

Числа в теле процедур указывают системные номера функций. Следует отметить, что в новой версии Maple 7 они существенно отличаются от принятых в предшествующих версиях.

Ключ system

Этот ключ придает процедуре статус системной. У таких процедур таблица памяти может быть удалена. У обычных процедур таблица памяти не удаляется и входит в так называемый «мусорный ящик» (garbage collector).

Ключи operator и arrow

Эта пара ключей задает процедуре статус оператора в «стрелочной» нотации (->). Это достаточно пояснить следующими примерами:



Содержание раздела