Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
практичні алгоритмізація дл студ.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
6.12 Mб
Скачать

Рекурсія

Програми, які ми обговорювали, мали в основному структуру функцій, які викликають інші функції, підкоряючись строгій ієрархії. Для деяких типів завдань корисно мати функції, які викликають самі себе. Рекурсивна функція - це функція, яка викликає саму себе або непосредственно або побічно через іншу функцію. Рекурсія - складний предмет, що вивчається лише в деяких курсах по комп'ютерних дисциплінах. У цьому і в наступних розділах наведені прості приклади рекурсії.

7. Напишіть і запустіть програму на виконання що написана нижче. Дослідіть хід її роботи.

/* Приклад по зонах дії */

#include <stdio.h>

void a(void); /* прототип функції */

void b(void); /* прототип функції */

void c(void); /* прототип функції */

int х = 1;/* глобальна змінна */

main ( )

{

int х = 5; /* локальна змінна для main */

printf ("local х in outer scope of main is %d\n", x);

{ /* початок нової зони дії */

int х = 7;

printf ("local x in inner scope of main is %d\n", x);

} /* кінець нової зони дії */

printf("local x in outer scope of main is %d\n", x);

a (); /* а містить автоматичну локальну x */

b (); /* b містить статичну локальну x */

c (); /* c використовує глобальну х */

а (); /* а наново ініціалізував автоматичну локальну х */

b (); /* статична локальна х зберігає попереднє значення */

c (); /* глобальна х також зберігає своє значення */

printf("local х in main is %d\n", x);

return 0;

}

void a(void)

{

int x = 25; /* ініціалізувався при кожному виклику а */

printf("\nlocal х in a is %d after entering a\n", x);

++x;

printf("local x in a is %d before exiting a\n", x);

}

void b(void)

{

static int x = 50; /* ініціалізація як static */

/* тільки при першому виклику b */

printf("\nlocal static х is %d on entering b\n", x);

++х;

printf("local static х is %d on exiting b\n", x)

}

void c(void)

{

printf("\nglobal x is %d on entering c\n", x);

x *= 10;

printf("global x is %d on exiting c\n", x);

local x in outer scope of main is 5

local x in inner scope of main is 7

local x in outer scope of main is 5

local x in a is 25 after entering a

local x in a is 26 before exiting a

local static x is 50 on entering b

local static x is 51 on exiting b

global x is 1 on entering c

global x is 10 on exiting c

local x in a is 25 after entering a

local x in a is 26 before exiting a

local static x is 51 on entering b

local static x is 52 on exiting b

global x is 10 on entering c

global x is 100 on exiting c

local x in main is 5

Програма, що ілюструє зони дії

8. Напишіть і запустіть програму на виконання що написана нижче. Дослідіть хід її роботи.

Відсутність повернення значення з рекурсивної функції, коли він потрібний.

/* Рекурсивна функція factorial */

#include <stdio.h>

long factorial(long);

main ( )

{

int i;

for (і = 1; і <= 10; i++)

printf("%2d != %ld\n", i, factorial (i));

return 0;

}

/* /* Рекурсивне визначення функції factorial */

long factorial(long number)

{

if (number <= 1)

return 1;

else

return (number * factorial(number - 1));

}

1! = 1

2! = 2

3! = 6

4! = 24

5! = 120

6! = 720

7! = 5040

8! = 40320

9! = 362880

10! = 3628800