Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Програмування.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
865.28 Кб
Скачать

Лабораторна робота № 2 побудова|шикування| рекурсивних функцій

Мета. Отримати тримати практичні навички навички побудови рекурсивних функцій

на С++.

Короткі теоретичні відомості

Функції в С++ слугують для запису програмного коду безпосередньо розв’язуваних|рішати| підзадач. Виконання програми завжди починається з функції main(). Коли під час виконання програми зустрічається ім'я функції, відбувається|походить| звернення до цієї функції, тобто керування передається функції. Після того, як функція виконала свою роботу, керування повертається в те місце, звідки функція була викликана|спричинена|.

У С/С++ код, що описує, роботу функції, називається визначенням функції і має вигляд:

Заголовок_функции

{

оператор

}

Заголовок функції містить

тип_функции имя_функции(список аргументів)

Тип функції - (будь-який стандартний або абстрактний тип даних) визначає тип єдиного значення, яке повертає функція. Для повернення значення з функції слугує оператор return :

return значення;

У тому випадку, якщо функція не повертає жодного значення, її тип визначається ключовим|джерельним| словом void, і оператор return не використовується.

Рекурсивною називається функція, яка викликає|спричиняє| сама себе. Загальний|спільний| синтаксис оформлення рекурсивної функції:

тип_функции имя_функции (список аргументів)

{

.

<умова завершення рекурсії>

}

Прототип функції – це оголошення функції, але|та| не її визначення. Функція може бути оголошена до того, як вона визначена, і до того, як вона використовується, а визначення| може йти пізніше у цьому ж самому файлі, вибиратися з|із| бібліотеки або вказаного користувачем файла.

Приклад. Написати рекурсивні функції визначення n! і .

#include <iostream.h>

#include <conio.h>

unsigned factor_n(int ); // прототип функції визначення n!

// опис функції визначення xn

float multy_x_n(float x, int n)

{

if(n>1) // умова продовження рекурсії

return x*multy_x_n(n-1); // рекурсивний виклик функції

else // умова зупинки рекурсії

return x; //повернення значення під час останнього виклику функцією

//самої себе

}

// головна функція

void main(void)

{ int n;

float x;

cout<<"\nУведіть значення n для визначення n!:";

cin>>n;

cout<<"n!= "<<factor_n(n)<<endl;

cout<<" Уведіть|запровадьте| значення х і n для визначення x^n: ";

cin>>x>>n;

cout<<"x^n= "<<multy_x_n(x,n);

getch();

}

//опис функції обчислення|підрахунку| n!

unsigned long factor_n(int n)

{ if(n>1) return n*factor_n(n-1);

else return 1;

}

Завдання до лабораторної роботи № 2

  1. Вивчити правила побудови рекурсивних функцій на прикладі програм, що розглянуто у п.п. «Короткі теоретичні відомості» і «Приклад виконання лабораторної роботи №2». Перевірити роботу наведених програм.

  2. |задачі|Написати програму, що дозволяє розв’язати поставлену в індивідуальному завданні задачу з використанням рекурсивної функції.

Приклад виконання лабораторної роботи №2

  1. Приклад побудови рекурсивної функції. Відомо, що операцію множення на ненегативне ціле можна подати як рекурсивну операцію додавання. Написати рекурсивну функцію, що реалізує таке множення.

Подамо операцію множення у загальному вигляді через операцію додавання:

, (2.1)

або у рекурсивному вигляді:

(2.2)

Другий рядок у формулі (2.2) є умовою завершення рекурсії. Його відсутність може привести до того, що поступове зменшення множника n забезпечує перехід його значень до негативної області, а це, у свою чергу, може викликати зациклювання алгоритму та переповнення стеку.

Формула (2.2) є підґрунтям для написання рекурсивної функції. Як параметри функції виступатимуть значення k та n. Тип функції визначається типом множника k, оскільки, виходячи з умов задачі, n є цілим. Використаємо більш загальний випадок, коли k має тип float. Тоді визначення рекурсивної функції має вигляд:

float dobutok(int n, float k)

{ if (n>0) //умова продовження рекурсії

return dobutok(n-1,k)+k; //визначення рекурсивної суми

else //умова припинення рекурсії

return 0;

}

Визначення рекурсивної суми проводять у два етапи: спочатку виконують виклик рекурсивної функції dobutok() з параметром n, який зменшено на одиницю, після цього визначають рекурсивну суму як результат додавання до значення, отриманого у результаті рекурсивного виклику, значення параметра k .

  1. Приклад побудови головної функції та виклику рекурсивної.

#include<iostream.h>

float dobutok(int n, float k);

void main()

{ float k;

int n;

cout<<”\nВведіть значення n та k”;

cin>>n>>k;

cout<<”\nЗначення n*k= ”<<dobutok(n,k); //виклик рекурсивної функції

}

Заголовок рекурсивної функції, який наведено у другому рядку програми, дозволяє компілятору визначити тип функції та список параметрів, але не саму функцію. За правилами мови C/C++ заголовок функції необхідно навести до її використання, що у даному випадку виконано. Опис самої функції, який наведено у попередньому пункті, можна навести після головної функції або в окремому файлі за умов його коректного підключення.

Зміст|вміст,утримання| звіту щодо лабораторної роботи №2

  1. Титульна сторінка |аркуш|: назва дисципліни; номер і найменування роботи; прізвище, ім'я, по батькові студента; дата виконання.

  2. Постановлення завдання|задачі|.

  3. Пояснення можливості використання рекурсії у поставленому завданні. Визначення основних змінних і функцій з|із| коментарями.

  4. Реалізація функцій.

  5. Лістинг основної програми, де має бути вказано, в якому місці та яку функцію викликають|спричиняють|.

Варіанти завдань до лабораторної роботи №2

  1. Написати рекурсивну функцію для знаходження біноміальних| коефіцієнтів, користуючись їх визначенням:

  1. Задано ненегативні числа n і m. Необхідно обчислити|обчисляти,вичислити| функцію A(n, m), де

  1. Задано натуральні числа с|із| і m. Необхідно обчислити|обчисляти,вичислити| функцію f(m)

де g(m) – залишок|остача| від ділення|поділки,розподілу,поділу| (m +c) на 10.

  1. Обчислити|обчисляти,вичислити| функцію f(m), яку визначають для цілих позитивних чисел таким чином:

  1. Обчислити|обчисляти,вичислити| числа Фібоначі, якщо відомо, що два перші числа F1=F2=1, а значення подальших|наступних| чисел дорівнює сумі двох попередніх чисел ( Fk=Fk-1+Fk-2 ): 1,1,2,3,5,8 і т.і.

  2. Для заданого натурального числа n з'ясувати, чи можна подати |уявити| n! у вигляді добутку|добутку| трьох послідовних цілих чисел, тобто перевірити істинність виразу|вираження| n!= j(j+1)(j+2), знайшовши деяке число j.

  3. Серед чисел 1.. n (n - ціле позитивне число  25) знайти всі такі, запис яких співпадає|збігається| з|із| останніми цифрами запису їх квадрата (наприклад: 62=36, 252=625).

  4. Натуральне число з|із| n цифр є|з'являються,являються| числом Армстронга|, якщо сума його цифр, піднесених до n-ого ступеня, дорівнює самому числу. Одержати|отримати| всі числа Армстронга|, які належать заданому інтервалу двозначних цифр.

  5. Для заданого цілого числа n обчислити|обчисляти,вичислити| .

  6. Для заданого цілого числа n обчислити|обчисляти,вичислити| .

  7. Для заданого цілого числа n обчислити|обчисляти,вичислити| .

  8. Для заданого цілого числа n обчислити|обчисляти,вичислити| .

  9. Для заданого цілого числа n обчислити|обчисляти,вичислити| .

  10. Для заданого цілого числа n обчислити |обчисляти, вичислити |, де max5(x, у|в,біля|) - функція, що визначає більше з|із| двох значень х і у. Більшим з двох чисел уважають те|в,біля|, чий залишок|остача| від ділення|поділки,розподілу,поділу| на 5 є більшим.

  11. Для заданого цілого числа n обчислити|обчисляти,вичислити| .

  12. Для заданого цілого числа n обчислити|обчисляти,вичислити| .

  13. Для заданого цілого числа n обчислити|обчисляти,вичислити|

  1. Для заданого ненегативного числа n обчислити|обчисляти,вичислити|

  1. Написати рекурсивну функцію, яка визначає максимальне число з|із| вхідної послідовності чисел х (умову завершення введення чисел вибрати самостійно).

  2. Написати рекурсивну функцію, яка визначає у вхідній послідовності ненегативних чисел х мінімальне число і його порядковий номер (умову завершення введення чисел вибрати самостійно).

  3. Написати рекурсивну функцію, яка визначає добуток |добуток| введених|запроваджених| негативних|заперечних| дійсних чисел х (умовою завершення обчислень|підрахунків| вважати|лічити| введення позитивного числа).

  4. Написати рекурсивну функцію, яка визначає суму введених|запроваджених| дійсних чисел х, порядковий номер яких у вхідній послідовності кратний двом (умовою завершення обчислень|підрахунків| уважати|лічити| введення позитивного числа).

  5. Обчислити|обчисляти,вичислити| величину , де х1, х2..,хn (xi2) – послідовність позитивних дійсних чисел, кількість яких наперед|заздалегідь| невідома (умову завершення введення чисел вибрати самостійно).

  6. Для введеного|запровадженого| цілого n обчислити|обчисляти,вичислити| a020+ a121+ a323+.+ an2n, де а0, а1, а3., аn – приймають значення –1, 0,1 по черзі, тобто –1,0,1,-1,0,1, і т.д.

  7. Написати рекурсивну функцію переведення |переведення,переказу| десяткового числа у двійкову систему шляхом ділення|поділки,розподілу,поділу| його на 2 і видачі залишку|остачі| в зворотній послідовності.

  8. Для довільного цілого n визначити кількість чисел і їх суму в десятковому записі числа n!.

  9. Визначити значення , де xi – ненегативні числа (умову завершення введення чисел вибрати самостійно).

  10. Для довільного цілого n вивести на екран у зворотному порядку|ладі| проходження|дотримання| всі числа у десятковому записі значення n!.

  11. Визначити значення відношення|ставлення| максимального і мінімального з|із| послідовності введених|запроваджених| ненульових чисел (умову завершення введення чисел вибрати самостійно).

  12. Використовуючи послідовність негативних|заперечних| чисел, що вводять|запроваджують|, обчислити значення відношення|ставлення| . Умову завершення введення чисел вибрати самостійно.