Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Комп'ютерна алгебра.Навчально-методичний посібн...doc
Скачиваний:
17
Добавлен:
24.08.2019
Размер:
683.01 Кб
Скачать

2.14 Функції

Формат:

function ( [ arg-ident {, arg-ident} ] ) [ local loc-ident {, loc-ident} ; ] statements end

Приклад функції, яка визначає n-е число Фібоначчі:

gap> fib := function ( n ) > local f1, f2, f3, i; > f1 := 1; f2 := 1; > for i in [3..n] do > f3 := f1 + f2; f1 := f2; f2 := f3; > od; > return f2; > end;; gap> List( [1..10], fib ); [ 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 ]

Ту ж функцію можна визначити рекурсивно:

gap> fib := function ( n ) > if n < 3 then > return 1; > else > return fib(n-1)+ fib(n-2); > fi; > end;; gap> List( [1..10], fib ); [ 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 ]

Відмітимо, що рекурсивна версія вимагає 2 * fib(n)-1 кроків для обчислення fib(n), тоді як ітеративна вимагає тільки n-2 кроку.

Обидві, проте, не є оптимальними, оскільки бібліотечна функція Fibonacci вимагає порядку Log(n) кроків.

Запис arg-ident -> expr є коротким записом для функції

function ( arg-ident ) return expr; end

Тут arg-ident - один ідентифікатор, тобто таким чином не можна задати функцію від декількох змінних.

Приклад типового використання такого запису:

gap> Sum( List( [1..100], x -> x^2 )); 338350

3 Структури даних

3.1 Константи і оператори

Основні принципи завдання констант і дій над ними видно з наступних прикладів:

Приклад 1:

gap> 12345/25; 2469/5 gap> -3; 17 - 23; -3 -6 gap> 3^132; 955004950796825236893190701774414011919935138974343129836853841

Приклад 2 (операції з підстановками):

gap> (1,2,3); (1,2,3) gap> (1,2,3) * (1,2); (2,3) gap> (1,2,3)^-1; (1,3,2) gap> 2^(1,2,3); 3 gap> (1,2,3)^(1,2); (1,3,2)

Приклад 3 (завдання рядка):

gap> 'a'; 'a'

3.2 Змінні і привласнення

Порядок привласнення демонструється наступним прикладом:

Приклад 1:

gap> a:= (9 - 7) * (5 + 6); 22 gap> а; 22 gap> a:= 10; 10 gap> а * (а + 1); 110

Примітка 1. Після привласнення привласнене значення відображається в наступному рядку виводу. Це можна подавити, якщо завершити команду двома знаками ";" замість одного:

gap> w:= 2;;

Примітка 2. Всякий раз, коли GAP повертає значення, друкуючи його в наступному після команди рядку, це значення привласнюється змінною з ім'ям last :

gap> (9 - 7) * (5 + 6); 22 gap> a:= last; 22

Аналогічним чином визначаються змінні last2 і last3.