Функції в с для початківців

int sum (int n) // Як параметр буде передаватися число з місця виклику в змінну n

if (n == 1) return 1; // якщо нове значення 1, то будемо складати його з 1, а не з попереднім. тому попереднє - це нуль. і складання 1 + 0 буде нескінченним.

else return sum (n - 1) + n; // але якщо n> 1, то складаємо його з попереднім значенням, рівним сумі всіх елементів до n

system ( "cls"); // очищення екрана

cout <

Розглянемо цю програму докладніше. Це важливий момент.
Спочатку пишеться головна функція: int main (). Це марна програма, написана на C ++. Після написання порожній програми починається написання рекурсивної функції. У наведеному прикладі я нову функцію назвав int sum (int n)
Наша функція повинна порахувати суму елементів. Для спрощення беремо цілі числа. Функція буде щось рахувати, в нашому випадку функціонально буде виконувати додавання чисел. Результат складання функція буде віддавати, як результат своїх зусиль. Цей результат можна буде забрати в будь-який потрібний момент ззовні функції. Так як числа обрані цілі, то результат суми цілих чисел - це ціле число, тому для повертається результату використовується цілий тип, говоримо функції, що вона буде повертати int.

Рекурсивні фнкцій не знають, коли їм припиняти себе викликати, тому всередині них обов'язково писати умова для зупинки. У наведеному прикладі таким умовою є прихід в параметр n одиниці. Якщо n прийняв одиницю, то повертається одиниця, інакше функція викликає саму себе. Ось цей момент і важливо зловити, цей момент і зветься рекурсією. Щоб функція щось правильно вважала, для початку треба віддавати всередину неї правильні значення. Добре, коли значення якесь певне, але іноді потрібно трохи напружитися і порахувати це значення кодом, тільки після розрахунку віддавати. Ось такий розрахунок кодом тут і відбувається.
Функція sum приймає будь-яке число. Нехай у нас буде число більше одиниці (це для пояснення), функція бачить, що в n прийшла не одиниця і виконує копію самої себе. Створюється інша функція, яка просто копіюється з поточної, і Випоняемие сама по собі. І так створюється копія кожної функції. П'ять викликів - п'ять копій функцій створиться в пам'яті на якийсь момент часу.

А тепер дивіться, що відбувається:
Всередину функції віддано число 5. Функція викликана і розпочала роботу. n прийняв 5, відбувається перевірка, що в n, де з'ясовується, що в n не один, тому повертається якесь число. Якщо ви пам'ятаєте, то були обрані цілі числа, а повертається результат можна забрати в будь-який потрібний момент ззовні функції. Забирається результат з мегасхожей функції, насправді з нової функції, яка буде копією оной. Та функція, яка не копія, ще виконує свою роботу, вона чекає того значення, яке її треба буде віддати. Можете вважати, що ця не копія прийняла режим очікування. Починає роботу копія. Дивіться, що в цю копію приходить, в неї приходить (n-1). У неї приходить 5-1, що є 4. Перша функція чекає свого значення, копія першої функції приймає режим очікування, починає чекати свого значення, яке має буде повернути копія цієї копії. І так повторюється до тих пір, поки не трапиться 2-1, чому в n прийде 1. Як тільки в n прийде 1, спрацює return останньої створеної на той момент часу копії. У поточній програмі зазначено, що якщо в n приходить 1, то повертається 1. Цей момент припинення рекурсії є початком розрахунку. Ось такий хитрий віраж відбувається.

1) n == 1. Остання створена копія завершує свою роботу. Віддає 1.
2) Перед нею висить в пам'яті копія стає останньою. (У кожній створюваної копії n зменшувався на одиницю, значить зараз починає збільшуватись, було 1, стало 2. У поточній копії n == 2). Остання зараз копія повертає (1) +2, де (1) - це та одиниця, яка забирається як результат тієї завершеною копії. У формулах це можна розкласти приблизно так: ((sum (n-1) + n) ==> (1 + n) ==> (1 + 2) ==> 3)
3) Процес повторюється. n == 3. ((sum (n-1) + n) ==> (3 + n) ==> (3 + 3) ==> 6)
4) Процес повторюється. n == 4. ((sum (n-1) + n) ==> (6 + n) ==> (6 + 4) ==> 10)
5) Процес повторюється. n == 5. ((sum (n-1) + n) ==> (10 + n) ==> (10 + 5) ==> 15)

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

Підводимо підсумки, згадуємо, як писали програму.
1) Пишемо порожній блок головної програми.
2) Пишемо рекурсивную функцію.
3) Викликаємо рекурсивную дію із головного блоку програми.

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

Добрий день, упорото ні можу зрозуміти як виробляє обчислення дана функція

if (n == 1) return 1; // якщо нове значення 1, то будемо складати його з 1, а не з попереднім. тому попереднє - це нуль. і складання 1 + 0 буде нескінченним.
else return sum (n-1) + n; // але якщо n> 1, то складаємо його з попереднім значенням, рівним сумі всіх елементів до n
>

Як на мене в n перебувати 5 умова не збігається тоді виконується даний код sum (n-1) + n тобто до 5 додається що то отримане в дужках шляхом вирахування але що (5 - 1) +5 і якщо так то що зупиняє дане арифметична дія. Що за попереднє значення, звідки воно береться чому дорівнює.

Так майже всі так як я і зрозумів (в останньому абзаці ви показали рекурсию))), але залишитися питання як виходить сума, яка потім ви водитися на екран?
Я працюю з Dev C ++ у мене даний приклад виводить суму == 15, якщо по вважати як написано в прикладі то сума виходить інший.
Я писав вище ось візьмемо (5-1) + 5 = 4 + 5 = 9
І ще не зовсім логічно виходить в 8й рядку якщо поміняти повертається число з return 1 на 2 сума змінюється на 16 як це умова пов'язана з 9й рядком?

(5) // В функцію дали 5, перевірили її на рівність з одиницею. не дорівнює, викликали функцію знову, віддавши в неї 5-1
(5-1 + (5)) //.
(4-1 + (5-1 + (5)))
(3-1 + (4-1 + (5-1 + (5))))
(2-1 + (3-1 + (4-1 + (5-1 + (5)))))

2-1 == 1, закінчили викликати функцію.
(2-1 + (3-1 + (4-1 + (5-1 + (5))))) == 15
це і є результат.
Тут результат роботи функції - це різниця перших двох чисел, а n - це вся інша частина праворуч
__________________________________
Просто потрібно функцію правильно розуміти і приймати як обчислюється значення і не розуміти її як змінну. Вона схожа на змінну, але ближче до обчислюється константі. хоча константою і не є, просто сприймати так зручніше.

Да да да не встиг написати, що зрозумів, все вірно, що то відразу не дійшло. Спасибі вам хороший сайт))

І ще не зовсім логічно виходить в 8й рядку якщо поміняти повертається число з return 1 на 2 сума змінюється на 16 як це умова пов'язана з 9й рядком?
З цим теж все зрозуміло просто return 2 додає до суми так сказати свою позбавлення зоряницю.

Схожі статті