В програмуванні і інформатиці, рекурсія є методом розв'язання [en] при якому розв'язок покладається на розв'язки менших випадків цієї ж задачі. Рекурсія розв'язує такі рекурсивні задачі використовуючи функції чи процедури, які викликають самі себе. Цей підхід можна застосувати до багатьох задач, і рекурсія є однією з центральних ідей інформатики.
Процедура рекурсивна — процедура в програмуванні, у тілі якої знаходиться явне звернення до неї самої, або через іншу процедуру.
Сила рекурсії очевидно лежить в можливості визначення нескінченної множини об'єктів скінченним виразом. Таким же чином нескінченна кількість обчислень може бути описана скінченною рекурсивною програмою, навіть якщо ця програма не містить явних повторів.— Ніклаус Вірт, Algorithms + Data Structures = Programs, 1976
Більшість мов програмування підтримують рекурсію, дозволяючи функції викликати себе з власного коду. Деякі мови функціонального програмування (наприклад, Clojure) не містять ніяких конструкцій для циклів, і покладаються лише на рекурсію для багаторазового виконання коду. В теорії обчислювальності доведено що мови які містять лише рекурсію повні за Тюрінгом; це означає що вони такі ж потужні (можуть використовуватись для розв'язання таких самих задач) як і імперативні мови на основі таких структур як while
та for
.
Багаторазовий виклик функції собою може призвести до того що стек викликів матиме розмір що дорівнює сумі розмірів вхідних аргументів для всіх викликів. З цього випливає, що для задач які можна легко розв'язати ітерацією, рекурсія буде менш ефективна, і для великих задач критично використовувати методи оптимізації, такі як оптимізація хвостової рекурсії.
Застосування рекурсивних процедур, у багатьох випадках допомагає скоротити алгоритми, зробити їхню форму компактнішою.
Приклади
Рекурсивні процедури використовують, зокрема, для описання алгоритмів обчислення значень функцій, які задаються рекурентними співвідношеннями, наприклад:
- обчислення факторіалу n! = F(n): F(0) = 1; F(n) = n · F(n - 1)
- обчислення чисел Фібоначчі F(1) = F(2) = 1; F(n) = F(n - 1) + F(n - 2).
Види рекурсії
За рівнем рекурсії
Кількість рекурсивних входів називається рівнем рекурсії.
Рекурсія яка містить лише один самовиклик називається одиничною (англ. single recursion), а та яка має багато самовикликів — багатократною (англ. multiple recursion). Приклади одиничною рекурсії — обхід списку, лінійний пошук, обчислення факторіалу. Приклади багатократної — обхід дерева, пошук в глибину.
Одинична рекурсія обчислювально набагато ефективніша за багатократну, і зазвичай може бути заміненою ітерацією, яка потребує лінійного часу і константної пам'яті. Множинна рекурсія натомість потребує експоненційних ресурсів часу і пам'яті, і не може бути просто замінена ітерацією без використання явного стеку.
Множинну рекурсію іноді можна замінити одиничною (і, при потребі, ітерацією). Наприклад, наївний метод обчислення послідовності Фібоначчі використовує множинну рекурсію, так як кожне значення потребує двох попередніх, але його можна обчислити одиничною рекурсією, передаючи два послідовні значення як параметри. Більш природньо це описується корекурсією, яка накопичує результат з початкових значень, відслідковуючи два сусідні значення на кожному кроці. Див. (Корекурсія#Послідовність Фібоначчі) для прикладу. Складнішим прикладом може бути [en], що дозволяє здійснювати ітеративний обхід, а не тільки багатократну рекурсію.
Непряма рекурсія
Найпростіші приклади рекурсії, і більшість прикладів тут демонструють пряму рекурсію, в якій функція викликає себе. Непряма рекурсія з'являється тоді коли функція викликається не собою, а іншою функцією, яку вона (прямо або непрямо) викликала. Наприклад, якщо f викликає f, це пряма рекурсія, але якщо в f викликає g яка викликає f, тоді це непряма рекурсія. Можливі ланцюги з більшої кількості функцій, наприклад перша функція викликає другу, друга третю і т.д, а остання - знову першу.
Непряму рекурсію також називають взаємною рекурсією. Цей термін має те ж значення, просто робить наголос на іншому аспекті. Тобто якщо f викликає g і g викликає f, з точки зору лише f, f непрямо рекурсивна. З точки зору лише g, g - непрямо рекурсивна. А з точки зору обох, чи збоку, вони взаємно рекурсивні одна для одної. Подібно множина трьох і більше функцій може називатись множиною взаємно рекурсивних функцій.
Анонімна рекурсія
Див. також
- Рекурсія
- Хвостова рекурсія
- Рекурсивні функції (математичне визначення)
- Операція примітивної рекурсії
- Процедура (програмування)
Зноски
- Graham, Ronald; Knuth, Donald; Patashnik, Oren (1990). 1: Recurrent Problems. Concrete Mathematics (англ.). Addison-Wesley. ISBN . Архів оригіналу за 6 листопада 2020. Процитовано 27 жовтня 2023.
- Kuhail, M. A.; Negreiros, J.; Seffah, A. (2021). Teaching Recursive Thinking using Unplugged Activities (PDF). WTE&TE (англ.). 19: 169—175.
- Epp, Susanna (1995). Discrete Mathematics with Applications (англ.) (вид. 2nd). PWS Publishing Company. с. 427. ISBN .
- ЕК1973, с. 332.
- Wirth, Niklaus (1976). Algorithms + Data Structures = Programs (англ.). Prentice-Hall. с. 126. ISBN .
- Functional Programming | Clojure for the Brave and True. www.braveclojure.com. Процитовано 21 жовтня 2020.
Література
- Енциклопедія кібернетики : у 2 т. / за ред. В. М. Глушкова. — Київ : Гол. ред. Української радянської енциклопедії, 1973. — Т. 2.
Посилання
- IBM developerWorks: Mastering recursive programming [Архівовано 7 листопада 2006 у Wayback Machine.] — (англ.) переваги та недоліки, правила програмування рекурсивних процедур.
Це незавершена стаття з інформатики. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
V programuvanni i informatici rekursiya ye metodom rozv yazannya obchislyuvalnoyi zadachi en pri yakomu rozv yazok pokladayetsya na rozv yazki menshih vipadkiv ciyeyi zh zadachi 1 2 Rekursiya rozv yazuye taki rekursivni zadachi vikoristovuyuchi funkciyi chi proceduri yaki viklikayut sami sebe Cej pidhid mozhna zastosuvati do bagatoh zadach i rekursiya ye odniyeyu z centralnih idej informatiki 3 Derevo stvorene movoyu Logo z vikoristannyam rekursiyi Kozhnu gilku mozhna rozglyadati yak menshu versiyu dereva Procedura rekursivna procedura v programuvanni u tili yakoyi znahoditsya yavne zvernennya do neyi samoyi abo cherez inshu proceduru 4 Sila rekursiyi ochevidno lezhit v mozhlivosti viznachennya neskinchennoyi mnozhini ob yektiv skinchennim virazom Takim zhe chinom neskinchenna kilkist obchislen mozhe buti opisana skinchennoyu rekursivnoyu programoyu navit yaksho cya programa ne mistit yavnih povtoriv Niklaus Virt Algorithms Data Structures Programs 1976 5 Bilshist mov programuvannya pidtrimuyut rekursiyu dozvolyayuchi funkciyi viklikati sebe z vlasnogo kodu Deyaki movi funkcionalnogo programuvannya napriklad Clojure 6 ne mistyat niyakih konstrukcij dlya cikliv i pokladayutsya lishe na rekursiyu dlya bagatorazovogo vikonannya kodu V teoriyi obchislyuvalnosti dovedeno sho movi yaki mistyat lishe rekursiyu povni za Tyuringom ce oznachaye sho voni taki zh potuzhni mozhut vikoristovuvatis dlya rozv yazannya takih samih zadach yak i imperativni movi na osnovi takih struktur yak while ta for Bagatorazovij viklik funkciyi soboyu mozhe prizvesti do togo sho stek viklikiv matime rozmir sho dorivnyuye sumi rozmiriv vhidnih argumentiv dlya vsih viklikiv Z cogo viplivaye sho dlya zadach yaki mozhna legko rozv yazati iteraciyeyu rekursiya bude mensh efektivna i dlya velikih zadach kritichno vikoristovuvati metodi optimizaciyi taki yak optimizaciya hvostovoyi rekursiyi Zastosuvannya rekursivnih procedur u bagatoh vipadkah dopomagaye skorotiti algoritmi zrobiti yihnyu formu kompaktnishoyu Zmist 1 Prikladi 2 Vidi rekursiyi 2 1 Za rivnem rekursiyi 2 2 Nepryama rekursiya 2 3 Anonimna rekursiya 3 Div takozh 4 Znoski 5 Literatura 6 PosilannyaPrikladired Rekursivni proceduri vikoristovuyut zokrema dlya opisannya algoritmiv obchislennya znachen funkcij yaki zadayutsya rekurentnimi spivvidnoshennyami napriklad 4 obchislennya faktorialu n F n F 0 1 F n n F n 1 obchislennya chisel Fibonachchi F 1 F 2 1 F n F n 1 F n 2 Vidi rekursiyired Za rivnem rekursiyired Kilkist rekursivnih vhodiv nazivayetsya rivnem rekursiyi 4 Rekursiya yaka mistit lishe odin samoviklik nazivayetsya odinichnoyu angl single recursion a ta yaka maye bagato samoviklikiv bagatokratnoyu angl multiple recursion Prikladi odinichnoyu rekursiyi obhid spisku linijnij poshuk obchislennya faktorialu Prikladi bagatokratnoyi obhid dereva poshuk v glibinu Odinichna rekursiya obchislyuvalno nabagato efektivnisha za bagatokratnu i zazvichaj mozhe buti zaminenoyu iteraciyeyu yaka potrebuye linijnogo chasu i konstantnoyi pam yati Mnozhinna rekursiya natomist potrebuye eksponencijnih resursiv chasu i pam yati i ne mozhe buti prosto zaminena iteraciyeyu bez vikoristannya yavnogo steku Mnozhinnu rekursiyu inodi mozhna zaminiti odinichnoyu i pri potrebi iteraciyeyu Napriklad nayivnij metod obchislennya poslidovnosti Fibonachchi vikoristovuye mnozhinnu rekursiyu tak yak kozhne znachennya potrebuye dvoh poperednih ale jogo mozhna obchisliti odinichnoyu rekursiyeyu peredayuchi dva poslidovni znachennya yak parametri Bilsh prirodno ce opisuyetsya korekursiyeyu yaka nakopichuye rezultat z pochatkovih znachen vidslidkovuyuchi dva susidni znachennya na kozhnomu kroci Div Korekursiya Poslidovnist Fibonachchi dlya prikladu Skladnishim prikladom mozhe buti proshite dvijkove derevo en sho dozvolyaye zdijsnyuvati iterativnij obhid a ne tilki bagatokratnu rekursiyu Nepryama rekursiyared Dokladnishe Vzayemna rekursiya Najprostishi prikladi rekursiyi i bilshist prikladiv tut demonstruyut pryamu rekursiyu v yakij funkciya viklikaye sebe Nepryama rekursiya z yavlyayetsya todi koli funkciya viklikayetsya ne soboyu a inshoyu funkciyeyu yaku vona pryamo abo nepryamo viklikala Napriklad yaksho f viklikaye f ce pryama rekursiya ale yaksho v f viklikaye g yaka viklikaye f todi ce nepryama rekursiya Mozhlivi lancyugi z bilshoyi kilkosti funkcij napriklad persha funkciya viklikaye drugu druga tretyu i t d a ostannya znovu pershu Nepryamu rekursiyu takozh nazivayut vzayemnoyu rekursiyeyu Cej termin maye te zh znachennya prosto robit nagolos na inshomu aspekti Tobto yaksho f viklikaye g i g viklikaye f z tochki zoru lishe f f nepryamo rekursivna Z tochki zoru lishe g g nepryamo rekursivna A z tochki zoru oboh chi zboku voni vzayemno rekursivni odna dlya odnoyi Podibno mnozhina troh i bilshe funkcij mozhe nazivatis mnozhinoyu vzayemno rekursivnih funkcij Anonimna rekursiyared Dokladnishe Anonimna rekursiyaDiv takozhred Rekursiya Hvostova rekursiya Rekursivni funkciyi matematichne viznachennya Operaciya primitivnoyi rekursiyi Procedura programuvannya Znoskired Graham Ronald Knuth Donald Patashnik Oren 1990 1 Recurrent Problems Concrete Mathematics angl Addison Wesley ISBN 0 201 55802 5 Arhiv originalu za 6 listopada 2020 Procitovano 27 zhovtnya 2023 Kuhail M A Negreiros J Seffah A 2021 Teaching Recursive Thinking using Unplugged Activities PDF WTE amp TE angl 19 169 175 Epp Susanna 1995 Discrete Mathematics with Applications angl vid 2nd PWS Publishing Company s 427 ISBN 978 0 53494446 9 a b v EK1973 s 332 Wirth Niklaus 1976 Algorithms Data Structures Programs angl Prentice Hall s 126 ISBN 978 0 13022418 7 Functional Programming Clojure for the Brave and True www braveclojure com Procitovano 21 zhovtnya 2020 Literaturared Enciklopediya kibernetiki u 2 t za red V M Glushkova Kiyiv Gol red Ukrayinskoyi radyanskoyi enciklopediyi 1973 T 2 Posilannyared IBM developerWorks Mastering recursive programming Arhivovano 7 listopada 2006 u Wayback Machine angl perevagi ta nedoliki pravila programuvannya rekursivnih procedur nbsp Ce nezavershena stattya z informatiki Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi Otrimano z https uk wikipedia org w index php title Rekursiya programuvannya amp oldid 41813742 Za rivnem rekursiyi