Національний технічний університет України
«Київський політехнічний інститут імені Ігоря Сікорського»
Алгоритмізація та програмування 1: Базові концепції програмування
ЗВІТ
до лабораторної роботи № 5
«Рекурсивний виклик функції»
Варіант № 13
Дата «21» листопада, 2021 р.
Завдання до роботи:
1. Ознайомитись з рекурсивним викликом функції.
2. Розробити алгоритмом розрахунку значення функції за її розкладенням у ряд за умови отримання результату з заданою точністю. Врахувати діапазон дозволених значень для змінної x.
3. У якості індивідуального завдання необхідно написати програмний код, що реалізує алгоритм розрахунку значень функцій за їх розкладенням в ряд із заданою користувачем точністю.
/
Рисунок 1 Індивідуальне завдання
Рекурсивний виклик функції
Рекурсивні функції — клас функцій, введений як уточнення класу обчислюваних функцій. В математиці загальноприйнятою є теза про те, що клас функцій, для обчислення яких існують алгоритми, при найширшому розумінні алгоритму, збігається з класом рекурсивних функцій. У зв'язку з цим, рекурсивні функції грають важливу роль в математиці та її застосуваннях, в першу чергу, в математичній логіці, основах математики та кібернетиці, як ефективно обчислювані функції. Тільки такі функції можна обчислювати на електроних обчислювальних машинах та інших цифрових пристроях.
Рекурсивна функція (процедура) — це така функція (процедура), серед ВиконуванихОператорів, якою є оператор виклику самої цієї функції (процедури).
Рекурсивні функції в програмуванні
У програмуванні рекурсія — виклик функції чи процедури з неї самої (звичайно з іншими значеннями вхідних параметрів), чи безпосередньо через інші функції (наприклад, функція А викликає функцію B, а функція B — функцію A). Кількість вкладених викликів функції чи процедури називається глибиною рекурсії.
Міць рекурсивного визначення об'єкта в тім, що таке кінцеве визначення здатне описувати нескінченно велике число об'єктів. За допомогою рекурсивної програми ж можливо описати нескінченне обчислення, причому без явних повторень частин програми.
Існує спеціальний тип рекурсії, називаний «хвостовою рекурсією». Інтерпретатори і компілятори функціональных мов програмування, що підтримують оптимізацію коду (вихідного і/чи що виконується), виконують хвостову рекурсію в обмеженому обсязі пам'яті за допомогою ітерацій.
Варто уникати надлишкової глибини рекурсії, тому що це може викликати переповнення стека викликів.
Базисний приклад в мові PHP: При створенні нової функції f() в її тілі викликається та сама функція f() зі зміненим аргументом:
function f($x){
Обчислення та друк добутка числа на 2.
return $x*2 . '<br />';
$y=$x*2;
Виклик функції f() в власному тілі ще раз, але з новим аргументом.
f($y);
}
Приклад 1: Отримуємо числа добуток 1*2 яких ще раз перемножувався на 2:
2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048 і тд...
Алгоритм роботи програми
Створимо три методи, які будуть рекурсивно обчислювати факторіал заданого числа, розкладати в ряд дві тригонометричні функції та обчислювати іх суму, поки її різниця із справжнього значення ф-ії не стане меншою за вказану користувачем точність відповідно. Користувач вводить вхідні дані, які ми маємо перевірити із областю допустимих значень для нашої функції, у випадку неправильного вводу програма надсилає характерне повідомлення та перестає працювати. Отже, обчислюємо функцію двома способами, користуючись створеними методами, та виводимо результат, який треба перевірити калькулятором задля впевненості у правильності виконання.
/
Рисунок 2 значення тригонометричних ф-ій та відповідні їм суми рядів
/
Рисунок 3 Блок-схема
/
Рисунок 4 Результат 1
/
Рисунок 5 Результат 2
Висновки: ознайомався із принципом створення та використання рекурсивних функцій. З використанням рекурсивної функції, що обчислює факторіал, порахував суму ряду, яка обчислює тригонометричні функції. До речі, обрахувати суму ряду можно також не циклом, а за допомогою рекурсії, бо майже для всіх циклів є аналоги-методи, що є рекурсивними.
Додаток (програмний код)
https://replit.com/join/jxmkpikfkv-tr-15-turlak-sergei
double get_factorial(double n)
{
if (n <= 1.0)
return 1.0;
else
return n * get_factorial(n - 1);
}
double get_sin(double degr, double precision)
{
double sum = 0;
double rad = degr / 180 * M_PI;
for (int k = 0; fabs(sin(rad) - sum) > precision; k++)
{
sum += pow(-1, k) * pow(rad, 2*k + 1) / get_factorial(2*k + 1);
}
return sum;
}
double get_cos(double degr, double precision)
{
double sum = 0;
double rad = degr / 180 * M_PI;
for (int k = 0; fabs(cos(rad) - sum) > precision; k++)
{
sum += pow(-1, k) * pow(rad, 2*k) / get_factorial(2*k);
}
return sum;
}