- •Р.М.Літнарович, ю.Г.Лотюк комп’ютерна алгебра навчально-методичний посібник
- •© Літнарович р.М., Лотюк ю.Г.,2010 р.
- •1. Програма нормативної дисципліни
- •2. Мета та завдання дисципліни,
- •3. Формування практичних навичків
- •4. Зміст дисципліни
- •4.1.Лекції, найменування тем за їх змістом
- •6.Перелік питань до заліку
- •7.Науково-дослідна робота студентів
- •8. Літературні джерела
- •9.Розподіл балів за один змістовий модуль, присвоюваних студентам
- •10.Шкала оцінювання:
- •11.Зміни та доповнення ,внесені в робочу програму на 201__ рік
- •12.Оцінка навчальної діяльності студента
- •2. Лекційний курс Лекція 1. (2 год.)
- •1.1 Коротка характеристика gap
- •1.2 Можливості для роботи з різними видами об'єктів алгебри
- •1.3 Приклади простих обчислень
- •2 Мова програмування gap
- •2.1 Символи і категорії слів в gap
- •2.2 Ключові слова
- •2.3 Ідентифікатори
- •2.4 Вирази
- •2.5 Звернення до функцій
- •2.6 Порівняння виразів
- •2.7 Арифметичні оператори
- •2.8 Привласнення
- •2.9 Виклик процедури
- •2.10 Команда if
- •2.11 Цикл while
- •2.12 Цикл repeat
- •2.13 Цикл for
- •2.14 Функції
- •3 Структури даних
- •3.1 Константи і оператори
- •3.2 Змінні і привласнення
- •3.3 Функції
- •3.4 Списки
- •3.5 Тотожність і рівність списків
- •3.6 Множини
- •3.7 Вектори і матриці
- •3.8 Записи
- •3.9 Арифметичні прогресії
- •3.10 Використання циклів
- •3.11 Подальші операції із списками
- •3.12 Функції
- •4 Операції над групами і їх елементами
- •4.1 Завдання групи підстановок
- •4.2 Завдання підгрупи групи підстановок
- •4.3 Прості властивості групи. Силовськие підгрупи.
- •4.4 Інші види підгруп
- •4.5 Факторгруппи
- •Список літератури, що рекомендується
- •Додаток а Рекомендації по створенню і запуску програм в системі gap
- •1. Створюємо за допомогою текстового редактора файл "prog.G" наступного змісту:
- •2. Зберігаємо цей файл в каталозі, вибраному з урахуванням рекомендацій параграфа 1.2.
- •3. Запустимо gap і визначимо файл протоколу log.Txt:
- •Лабораторна робота № 1. Основи роботи з системою gap в Windows
- •Лабораторна робота № 2 Списки. Цілі числа
- •Завдання для лабораторної роботи № 2
- •Лабораторна робота № 3. Лінійні програми. Вектори і матриці
- •Завдання для лабораторної роботи № 3
- •Лабораторна робота № 4. Програми, що гілкуються. Многочлени
- •Лабораторна робота № 5. Циклічні програми (цикл for). Бінарні відносини
- •Лабораторна робота № 6. Циклічні програми (цикл while). Підстановки
- •Лабораторна робота № 7. Циклічні програми (цикл repeat). Групи підстановок
- •Завдання для лабораторної роботи № 7
- •Лабораторна робота № 8. Вивчення властивостей елементів групи
- •Завдання для лабораторної роботи № 7
- •Лабораторна робота № 9. Вивчення властивостей підгруп групи.
- •Завдання для лабораторної роботи № 9.
- •Лабораторна робота № 10. Робота з бібліотекою кінцевих груп
- •Додаткові завдання
- •33027 Рівне , Україна
3.12 Функції
Раніше було показано, як звернутися до бібліотечних, тобто стандартним функціям GAP. Даний розділ присвячений розробці нових функцій.
Приклад 1: задати просту функцію, яка друкує на екрані текст "hello, world.".
gap> sayhello:= function() > Print("hello, world.\n"); > end; function ( ) ... end
При цьому додавання до рядка виведення символів "\n" приведе до того, що наступне запрошення GAP з'явиться на новому рядку, а не безпосередньо після надрукованого тексту.
Визначення функції починається з ключового слова function, після якого в дужках указуються формальні параметри. Дужки необхідні і в тому випадку, якщо параметри відсутні. Слід звернути увагу на відсутність крапки з комою після першої команди. Визначення функції завершується ключовим словом end.
Функція після її визначення є такій же змінній, як і цілі числа, суми і списки, і може бути привласнена іншій змінній. Завершуючий знак ";" у приведеному прикладі не належить до визначення функції, а завершує її привласнення імені sayhello. Після цього, на відміну від інших привласнень, значення функції sayhello відображається в скороченій формі function ( ) ... end, що відображає тільки її формальні параметри, як найцікавішу частину.
Повного значення sayhello може бути набуте за допомогою функції Print:
gap> Print(sayhello, "\n"); function ( ) Print( "hello, world.\n" ); return; end
Звернення до даної функції відбудеться по команді sayhello():
gap> sayhello(); hello, world
Проте даний приклад не є типовим, оскільки введена нами функція не повертає жодне значення, а тільки друкує текст.
Приклад 2: завдання функції, що визначає знак числа.
gap> sign:= function(n) > if n < 0 then > return -1; > elif n = 0 then > return 0; > else > return 1; > fi; > end; function ( n ) ... end gap> sign(0); sign(-99); sign(11); 0 -1 1
Приклад 3:
Числа Фібоначчі визначаються рекурсивно: f (1) = f (2) = 1, f (n) = f (n-1) + f (n-2).
Оскільки функція в GAP може звертатися сама до себе, то функція для обчислення n-го числа Фібоначчі може бути задана таким чином:
gap> fib:= function(n) > if n in [1, 2] then > return 1; > else > return fib(n-1)+ fib(n-2); > fi; > end; function ( n ) ... end gap> fib(15); 610
Вправа: Додати до даної функції перевірку того, що n є натуральним числом.
Приклад 4:
Функція gcd, що обчислює найбільшого загального дільника двох цілих чисел по алгоритму Евкліда, вимагає створення локальних змінних на додаток до формальних параметрів. Опис локальних змінних, якщо вони є, повинен передувати всім операторам, що входять у визначення функції.
gap> gcd:= function(а, b) > local з; > while b <> 0 do > c:= b; > b:= а mod b; > a:= з; > od; > return з; > end; function ( а, b ) ... end gap> gcd(30, 63); 3
Приклад 5:
складемо функцію, яка визначає кількість розкладань натурального числа (розкладанням даного числа називається незростаюча послідовність натуральних чисел, сума яких дорівнює даному числу). Вся безліч розкладань для даного числа n може бути розділене на підмножини залежно від максимального елементу розкладання. Тоді кількість розкладань для n дорівнює сумі по всіх можливих i кількостей розкладань для n-i, елементи яких менші, ніж i. Узагальнюючи це, отримуємо, що кількість розкладань числа n, елементи яких менші, ніж m, є сумою (по i < m,n) кількості розкладань для n-i з елементами, меншими, ніж i. Звідси отримуємо наступну функцію:
gap> nrparts:= function(n) > local np; > np:= function(n, m) > local i, res; > if n = 0 then > return 1; > fi; > res:= 0; > for i in [1..Minimum(n,m)] do > res:= res + np(n-i, i); > od; > return res; > end; > return np(n,n); > end; function ( n ) ... end
Бажаючи скласти функцію, яка має один аргумент, ми вирішили поставлену задачу за допомогою рекурсивної процедури з двома аргументами. Тому знадобилося фактично ввести дві функції. Єдиним завданням одним з них є виклик інший з двома рівними аргументами.
При цьому функція np є локальною по відношенню до nrparts . Вона могла б бути визначена і незалежно, але тоді ідентифікатор np вже не міг би бути використаний для інших цілей, а якби це все-таки відбулося, функція nrparts не могла б звернутися до функції np.
Тепер розглянемо функцію np, що має дві локальні змінні res і i. Змінна res використовується для підсумовування, i - параметр циклу. Усередині циклу знову відбувається звернення до функції np, але вже з іншими аргументами. Проте для швидкодії програми переважно уникати рекурсивних процедур, якщо тільки можна без них обійтися.
Вправа: Запропонувати рішення останньої задачі, не використовуючи рекурсивні процедури.
[Попередній розділ <file:///d:\ Комп'ютерна%20алгебра\metgap43\2-lang.htm> ][Зміст <file:///d:\ Комп'ютерна%20алгебра\metgap43\metgap43.htm> ][Наступний розділ <file:///d:\ Комп'ютерна%20алгебра\metgap43\4-groups.htm> ]
[Попередній розділ <file:///d:\ Комп'ютерна%20алгебра\metgap43\3-data.htm> ][Зміст <file:///d:\ Комп'ютерна%20алгебра\metgap43\metgap43.htm> ][Наступний розділ <file:///d:\ Комп'ютерна%20алгебра\metgap43\refs.htm> ]