Иллюстрированный самоучитель по Maple 6/7

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

В объявление процедуры можно включить ключевые слова, вводимые словом 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-1)+f(n-2) fi end;
f: = proc(w)if n <2 then и else f(n -1) + 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 они существенно отличаются от принятых в предшествующих версиях.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.