Рекурсія (рекурсійна функція) – це повторювальний виклик одної, і тої ж самої функції всередині себе до визначення певної умови. Умовою повинно бути обов’язкове закінчення функції (вихід з неї), в іншому випадку відбудеться зациклення, що призведе до збою програми.
Історія виникнення рекурсії
Термін “рекурсія” використовувався в математиці задовго до того, як з’явилися комп’ютери та програмування. Він вперше був введений в 1842 році математиком та логіком Августом Мебіусом для опису функції, що повторюється сама в собі.
У програмуванні рекурсія почала використовуватися з моменту виникнення перших мов програмування, наприклад, Fortran та Lisp, що з’явилися в 1950-ті роки. Одним з ранніх прикладів використання рекурсії було введення числа Фібоначчі, яке було описано в книзі “The Art of Computer Programming” Дональда Кнута.
Приклад рекурсії
Розгляньмо приклад рекурсії, обчисливши факторіал числа.
>> def factorial(n):<br>... if n == 0:<br>... return 1<br>... else:<br>... print(n)<br>... return n * factorial(n-1)<br>...<br>>>> factorial(5)<br>5<br>4<br>3<br>2<br>1<br>120
Ця функція обчислює факторіал числа n
шляхом виклику самої себе з аргументом n-1
, поки n
не дорівнює 0
. Коли n
дорівнює 0
, функція повертає 1
Наприклад, факторіал числа 5 можна обчислити, викликавши функцію factorial(5). Функція спочатку перевіряє, чи n не дорівнює 0. Оскільки n дорівнює 5, функція повертає 5 * factorial(4). Функція factorial(4) знову викликає саму себе і повертає 4 * factorial(3). Цей процес триває, доки функція не дорівнює factorial(0), що повертає 1. Тоді, функція factorial(1) поверне 1 * factorial(0), що також дорівнює 1. Кінцевий результат factorial(5) буде 120, оскільки 5 * 4 * 3 * 2 * 1 дорівнює 120.
Рекурсія і цикл
Цикли та рекурсія – це два різних способи вирішення завдань, і вибір одного з них залежить від конкретної задачі. В деяких випадках рекурсія може бути більш читабельною та простішою для реалізації, ніж цикл. Однак, в інших випадках, особливо коли рекурсія викликається багато разів, вона може бути менш ефективною з точки зору продуктивності, оскільки при кожному виклику функції створюється новий контекст функції та новий стек викликів.
Рекурсія може бути особливо корисною в таких задачах, де завдання можна розділити на менші, але аналогічні задачі. Вона допоможе уникнути дублювання коду та спростити реалізацію, оскільки завдання можна вирішити шляхом виклику тієї ж функції з іншими аргументами.
Цикли, з іншого боку, можуть бути більш простим та ефективним способом вирішення завдань у випадках, коли потрібно виконувати однакову послідовність операцій багато разів з різними параметрами, і коли це можливо зробити без створення багатьох викликів функцій.