Стоит добавить в процедуру ключ remember, и время вычислений резко уменьшится:
> restart;
> fe:=proc(n) options remember; if n<2 then n else fe(n-1)+fe(n-2) fi
end:
> fe(30);
> time(fe(30));
При этом вычисление fe(30) происходит практически мгновенно, так как все промежуточные результаты в первом случае вычисляются заново, а во втором они берутся из таблицы. Однако это справедливо лишь тогда, когда к процедуре было хотя бы однократное обращение. Обратите внимание на то, что данные процедуры являются
10.3.11. Ключ builtin
Ключ builtin придает процедуре статус
> eval(type);
> eval(print) ;
Числа в теле процедур указывают системные номера функций. Следует отметить, что в новой версии Maple 9 они существенно отличаются от принятых в предшествующих версиях (даже Maple 8).
10.3.12. Ключ system
Этот ключ придает процедуре статус
10.3.13. Ключи operator и arrow
Эта пара ключей задает процедуре статус оператора в «стрелочной» нотации (->). Это достаточно пояснить следующими примерами:
> o:=proc(x,y) option operator , arrow; x-sqrt(у) end;
> о(4, 2);
> о(4, 2.);
10.3.14. Ключ trace
Ключ trace задает вывод отладочной информации:
> o:=proc(x,y) option trace, arrow; x-sqrt(y) end;
> о(4, 2.);
{—> enter o, args =4, 2.
<- exit о (now at top level) = 2.585786438}
10.3.15. Ключ copyright
Этот ключ защищает тело процедуры от просмотра. Это поясняют следующие два примера:
> o:=proc(x,y) x-sqrt(у) end;
> oo:=proc(х,у) option Copyright; x-sqrt(у) end;
> oo(4,2.);
Нетрудно заметить, что во втором примере тело процедуры уже не просматривается. Для отмены защиты от просмотра можно использовать оператор 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.