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

> restart;

> fe:=proc(n) options remember; if n<2 then n else fe(n-1)+fe(n-2) fi

end:

> fe(30);

832040

> time(fe(30));

0.

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

10.3.11. Ключ builtin

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

> eval(type);

proc() option builtin, 274 end proc

> eval(print) ;

proc() option builtin, 235 end proc

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

10.3.12. Ключ system

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

10.3.13. Ключи operator и arrow

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

> o:=proc(x,y) option operator , arrow; x-sqrt(у) end;

о:=(x,y)→x-√y

> о(4, 2);

4 - 2

> о(4, 2.);

2.585786438

10.3.14. Ключ trace

Ключ trace задает вывод отладочной информации:

> o:=proc(x,y) option trace, arrow; x-sqrt(y) end;

о: = proc(x, y) option trace, arrow, x - sqrt(y) end proc

> о(4, 2.);

{—> enter o, args =4, 2.

2.585786438

<- exit о (now at top level) = 2.585786438}

2.585786438

10.3.15. Ключ copyright

Этот ключ защищает тело процедуры от просмотра. Это поясняют следующие два примера:

> o:=proc(x,y) x-sqrt(у) end;

о: = proc(x, х - sqrt(у) end proc

> oo:=proc(х,у) option Copyright; x-sqrt(у) end;

oo:= proc(x,у) … end proc

> oo(4,2.);

2.585786438

Нетрудно заметить, что во втором примере тело процедуры уже не просматривается. Для отмены защиты от просмотра можно использовать оператор interface(verboseproc=2).

10.3.16. Общая форма задания процедуры

Выше мы рассмотрели основные частные формы задания процедур. Все они могут быть объединены в общую форму задания процедуры:

name:=proc(<argseq>) # объявление процедуры

local<nseq>; # объявление локальных переменных

global<nseq>; # объявление глобальных переменных

uses<useg> # объявление структур use ... in ... end use

options<nseq>; # объявление расширяющих ключей

description<stringseq>; # объявление комментарий

<stateq> # выражения — тело процедуры

end; (или end:) # объявление конца процедуры

Эта форма охватывает все описанные выше частные формы и позволяет готовить самые сложные и надежно работающие процедуры. Читателям-программистам стоит детально изучить по справке возможности этой формы задания процедур, а также возможности конструкции use … in … end use.

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату