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

5.6 Рекурсивні функції

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

Факторіал цілого невід'ємного числа n, записується як n!, і обчислюється за формулою:

n! = n * (n-1) * (n-2) * (n-3) * ... * 1

Наприклад, факторіал п'яти, є добутком 5*4*3*2*1, який дорівнює 120.

Розглянемо рекурсивну функцію для обчислення факторіалу:

Приклад 5.5 Обчислення факторіалу.

#include <stdio.h>

#include <stdlib.h>

int fact(int a)

{

if (a > 1)

return (a * fact(a – 1));

else

return(1);

}

int main ()

{

int n;

printf("Vvedit chuslo: ");

scanf ("%i",&n);

printf("%i! = %i \n", n, fact(n));

system("PAUSE");

return 0;

}

Результат роботи програми:

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

Рисунок 5.4 – Приклад обчислення 5! за допомогою рекурсивної функції.

5.7 Прототипи функцій

Прототип функції – це оголошення функції, яке не містить тіло функції і повідомляє компілятору:

  • тип даних, який повертає функція;

  • число, тип та порядок параметрів, які функція приймає.

Прототип дає можливість викликати функцію до моменту її оголошення.

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

Синтаксис оголошення прототипу функції наступний:

<тип> <ім’я функції> (параметр1, параметр2,…);

Цей синтаксис ідентичний визначенню функції, за винятком того що він не включає тіло самої функції, а в кінці ставиться крапка з комою (;).

Компілятор ігнорує імена змінних вказаних в прототипі функції, тобто при оголошенні прототипу достатньо вказати лише типи параметрів.

Приклад 5.6. Використання прототипу функції без вказання імен змінних у прототипі.

#include <stdio.h>

int function(int, int, int); /* оголошення прототипу

функції*/

int main(void) /* головна програма*/

{

printf ("suma = %d \n", function (4, 5, 6));

return 0;

}

int function(int a, int b, int c) /* визначення функції*/

{

return a + b + c;

}

Приклад 5.7. Використання прототипів функцій.

#include <stdio.h>

#include <stdlib.h>

void Parne(int a); /* оголошення прототипу

функції Parne*/

void Neparne(int a); /* голошення прототипу

функції Neparne*/

int main ()

{

int i;

printf(" Vvedit chuslo(Vuhid – 0): ");

scanf ("%i",& i);

while (i!=0) {

Parne(i);

printf(" Vvedit chuslo(Vuhid – 0): ");

scanf ("%i",& i);

}

system("PAUSE");

return 0;

}

void Parne (int a) /*визначення функції Parne*/

{

if ((a%2)==0)

printf("Parne.\n ");

else Neparne(a);

}

void Neparne (int a) /* визначення функції Neparne*/

{

if ((a%2)!=0)

printf("Neparne.\n ");

else Parne(a);

}

Результат роботи програми:

У прикладі 5.7 показано випадок у якому необхідно використовувати прототипи функцій.

На початку програми оголошуються прототипи функцій Parne і Neparne:

void Parne (int a);

void Neparne (int a);

Прототипи дозволяють викликати функції до моменту їх визначення. На рисунку 5.5 зображено структури програм з використанням прототипу функції та без нього.

Рисунок 5.5 – Cтруктура програми з прототипом функції та без нього

У програмі з прикладу 5.7 неможливо обійтись без прототипів, так як існує потреба взаємного викли5ку двох функцій (функція Parne викликає функцію Neparne, яка в свою чергу викливає функцію Parne). Якщо не використовувати прототипи, то компілятор видаватиме помилку, так як функція описана в програмі першою, викликатиме функцію, яка не описувалась в програмі раніше.

Контрольні запитання

  1. Для чого потрібні функції?

  2. Опишіть синтаксис визначення функції.

  3. Чим відрізняється аргумент і параметр функції?

  4. Що таке область видимості змінних?

  5. Що таке локальна змінна?

  6. Опишіть декілька видів виклику функцій.

  7. Що таке тип функції?

  8. Коли і для чого використовується тип void?

  9. Назвіть два види передачі параметрів у функцію.

  10. Що таке передача параметрів за посиланням?

  11. Для чого потрібна передача параметрів за посиланням

  12. Для чого потрібні рекурсивні функції?

  13. Назвіть основні переваги та недоліки рекурсивних функцій.

  14. Для чого використовуються прототипи функцій?

  15. В яких випадках неможливо обійтись без прототипів функцій?

  16. Опишіть синтаксис оголошення прототипу функції.

  17. Напишіть програму, яка зчитуватиме з клавіатури 2 числа і в залежності від введеного числа 1, 2, 3 чи 4 виводитиме на екран їх суму, різницю, добуток чи частку відповідно.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]