У комп'ютерних мовах програмування рекурсивний тип даних (також відомий як рекурсивно визначений, індуктивно визначений або індуктивний тип даних) — тип даних для значень, які можуть містити інші значення того самого типу. Дані рекурсивних типів зазвичай розглядаються як орієнтовані графи.
Важливим застосуванням рекурсії в інформатиці є визначення динамічних структур даних, таких як списки та дерева. Рекурсивні структури даних можуть динамічно збільшуватися до довільно великого розміру у відповідь на вимоги до виконання; на відміну від цього, вимоги до розміру статичного масиву повинні бути встановлені під час компіляції.
Іноді термін «індуктивний тип даних» використовується для алгебричних типів даних, які не обов'язково є рекурсивними.
Приклад
Прикладом є тип списку в Haskell :
data List a = Nil | Cons a (List a)
Це вказує на те, що список a — це або порожній список, або Cons-комірка, що містить «a» («заголовок» списку) та інший список («хвіст»). Інший приклад — подібний однозв'язний тип у Java:
class List<E> { E value; List<E> next; }
Це вказує на те, що непустий список типу E містить елемент даних типу E та посилання на інший об'єкт списку для решти списку (або нульове посилання, яке вказує на те, що це кінець списку).
Взаємно рекурсивні типи даних
Типи даних також можна визначити шляхом взаємної рекурсії. Найважливішим базовим прикладом цього є дерево, яке можна визначити взаємно рекурсивно в термінах лісу (список дерев). Символьно:
f: [t[1], ..., t [k]] t: v f
Ліс f складається зі списку дерев, тоді як дерево t складається з пари значення v та лісу f (його нащадків). Це визначення елегантне і з ним легко працювати абстрактно (наприклад, при доведенні теорем про властивості дерев), оскільки воно виражає дерево простими термінами: список одного типу та пара двох типів.
Це взаємно-рекурсивне визначення можна перетворити на однорекурсивне визначення шляхом вбудованого визначення лісу:
t: v [t[1], ..., t[k]]
Дерево t складається з пари значення v та списку дерев (його нащадків). Це визначення є більш компактним, але дещо заплутанішим: дерево складається з пари одного типу та списку іншого, які вимагають розплутування, щоб довести результати.
У Стандартному ML типи дерев та лісів можуть бути взаємно рекурсивно визначені наступним чином, дозволяючи порожні дерева: [1]
datatype 'a tree = Empty | Node of 'a * 'a forest and 'a forest = Nil | Cons of 'a tree * 'a forest
У Haskell типи дерев та лісів можна визначити аналогічним чином:
data Tree a = Empty | Node (a, Forest a) data Forest a = Nil | Cons (Tree a) (Forest a)
Теорія
У теорії типів рекурсивний тип має загальний вигляд μα.T, де змінна типу α може з'являтися в типі T і означає весь тип.
Наприклад, натуральні числа (див. Арифметику Пеано) можуть бути визначені типом даних в Haskell:
data Nat = Zero | Succ Nat
У теорії типів ми сказали б: де дві гілки типу sum представляють конструктори даних Zero і Succ. Нуль не приймає аргументів (таким чином, представлений типом одиниці), а Succ бере інший Nat (таким чином, інший елемент ).
Існує дві форми рекурсивних типів: так звані ізорекурсивні типи та еквірекурсивні типи. Ці дві форми відрізняються тим, як вводяться та усуваються терміни рекурсивного типу.
Ізорекурсивні типи
З ізорекурсивними типами — рекурсивним та його розширення (або розгортання) (Де позначення вказує на те, що всі екземпляри Z замінені на Y у X) — це різні типи (які не перетинаються) зі спеціальними терміновими конструкціями, які зазвичай називають roll і unroll (згортати і розгортати) що утворюють між собою ізоморфізм. Якщо бути точним: і, а ці дві є оберненими функціями.
Еквірекурсивні типи
Відповідно до еквірекурсивних правил, рекурсивний тип та його розгортання рівні — тобто ці два вирази типу розуміються як один і той же тип. Насправді, більшість теорій еквірекурсивних типів йдуть далі і по суті вказують, що будь-які два вирази типу з однаковим «нескінченним розширенням» еквівалентні. В результаті цих правил еквірекурсивні типи вносять значно більшу складність у систему типів, ніж ізорекурсивні типи. Алгоритмічні проблеми, такі як перевірка типу та висновок типу, є складнішими також для еквірекурсивних типів. Оскільки пряме порівняння не має сенсу для еквірекурсивного типу, їх можна перетворити в канонічну форму за час O (n log n), яку легко порівняти.
Еквірекурсивні типи охоплюють форму самореференційних (або взаємно референційних) визначень типів, що спостерігаються у процедурних та об'єктно-орієнтованих мовах програмування, а також виникають у теоретично-типовій семантиці об'єктів і класів. У функціональних мовах програмування набагато частіше зустрічаються ізорекурсивні типи (під виглядом типів даних).
У синонімах типу
Рекурсія не дозволена в синонімах типів у Miranda, OCaml (якщо не використовується прапорець -rectypes
або це запис чи варіант) та Haskell; так, наприклад, такі типи Haskell є незаконними:
type Bad = (Int, Bad) type Evil = Bool -> Evil
Натомість його потрібно загортати в алгебричний тип даних (навіть якщо він має лише один конструктор):
data Good = Pair Int Good data Fine = Fun (Bool -> Fine)
Це тому, що синоніми типів, як typedefs в C, замінюються їх визначенням під час компіляції. (Синоніми типів не є «справжніми» типами; вони просто «псевдоніми» для зручності програміста.) Але якщо це буде зроблено з рекурсивним типом, воно буде циклічно нескінченне, оскільки незалежно від того, скільки разів псевдонім замінено, він все одно посилається на себе, наприклад, «Bad» буде рости нескінченно довго: Bad
→ (Int, Bad)
→ (Int, (Int, Bad))
→ ...
.
Інший спосіб побачити це полягає в тому, що потрібен рівень опосередкованості (алгебричний тип даних) для того, щоб система ізорекурсивного типу могла зрозуміти, коли згортати і розгортати.
Див. також
Примітки
- Harper, 2000, "Data Types".
- Numbering Matters: First-Order Canonical Forms for Second-Order Recursive Types. CiteSeerX 10.1.1.4.2276.
Ця стаття заснована на матеріалі, взятому з [en] до 1 листопада 2008 року та включеному відповідно до умов «реліцензування» GFDL, версія 1.3 або пізнішої.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U komp yuternih movah programuvannya rekursivnij tip danih takozh vidomij yak rekursivno viznachenij induktivno viznachenij abo induktivnij tip danih tip danih dlya znachen yaki mozhut mistiti inshi znachennya togo samogo tipu Dani rekursivnih tipiv zazvichaj rozglyadayutsya yak oriyentovani grafi Vazhlivim zastosuvannyam rekursiyi v informatici ye viznachennya dinamichnih struktur danih takih yak spiski ta dereva Rekursivni strukturi danih mozhut dinamichno zbilshuvatisya do dovilno velikogo rozmiru u vidpovid na vimogi do vikonannya na vidminu vid cogo vimogi do rozmiru statichnogo masivu povinni buti vstanovleni pid chas kompilyaciyi Inodi termin induktivnij tip danih vikoristovuyetsya dlya algebrichnih tipiv danih yaki ne obov yazkovo ye rekursivnimi PrikladPrikladom ye tip spisku v Haskell data List a Nil Cons a List a Ce vkazuye na te sho spisok a ce abo porozhnij spisok abo Cons komirka sho mistit a zagolovok spisku ta inshij spisok hvist Inshij priklad podibnij odnozv yaznij tip u Java class List lt E gt E value List lt E gt next Ce vkazuye na te sho nepustij spisok tipu E mistit element danih tipu E ta posilannya na inshij ob yekt spisku dlya reshti spisku abo nulove posilannya yake vkazuye na te sho ce kinec spisku Vzayemno rekursivni tipi danih Dokladnishe Vzayemna rekursiya Tipi danih takozh mozhna viznachiti shlyahom vzayemnoyi rekursiyi Najvazhlivishim bazovim prikladom cogo ye derevo yake mozhna viznachiti vzayemno rekursivno v terminah lisu spisok derev Simvolno f t 1 t k t v f Lis f skladayetsya zi spisku derev todi yak derevo t skladayetsya z pari znachennya v ta lisu f jogo nashadkiv Ce viznachennya elegantne i z nim legko pracyuvati abstraktno napriklad pri dovedenni teorem pro vlastivosti derev oskilki vono virazhaye derevo prostimi terminami spisok odnogo tipu ta para dvoh tipiv Ce vzayemno rekursivne viznachennya mozhna peretvoriti na odnorekursivne viznachennya shlyahom vbudovanogo viznachennya lisu t v t 1 t k Derevo t skladayetsya z pari znachennya v ta spisku derev jogo nashadkiv Ce viznachennya ye bilsh kompaktnim ale desho zaplutanishim derevo skladayetsya z pari odnogo tipu ta spisku inshogo yaki vimagayut rozplutuvannya shob dovesti rezultati U Standartnomu ML tipi derev ta lisiv mozhut buti vzayemno rekursivno viznacheni nastupnim chinom dozvolyayuchi porozhni dereva 1 datatype a tree Empty Node of a a forest and a forest Nil Cons of a tree a forest U Haskell tipi derev ta lisiv mozhna viznachiti analogichnim chinom data Tree a Empty Node a Forest a data Forest a Nil Cons Tree a Forest a TeoriyaU teoriyi tipiv rekursivnij tip maye zagalnij viglyad ma T de zminna tipu a mozhe z yavlyatisya v tipi T i oznachaye ves tip Napriklad naturalni chisla div Arifmetiku Peano mozhut buti viznacheni tipom danih v Haskell data Nat Zero Succ Nat U teoriyi tipiv mi skazali b n a t m a 1 a displaystyle nat mu alpha 1 alpha de dvi gilki tipu sum predstavlyayut konstruktori danih Zero i Succ Nul ne prijmaye argumentiv takim chinom predstavlenij tipom odinici a Succ bere inshij Nat takim chinom inshij element m a 1 a displaystyle mu alpha 1 alpha Isnuye dvi formi rekursivnih tipiv tak zvani izorekursivni tipi ta ekvirekursivni tipi Ci dvi formi vidriznyayutsya tim yak vvodyatsya ta usuvayutsya termini rekursivnogo tipu Izorekursivni tipi Z izorekursivnimi tipami rekursivnim m a T displaystyle mu alpha T ta jogo rozshirennya abo rozgortannya T m a T a displaystyle T mu alpha T alpha De poznachennyaX Y Z displaystyle X Y Z vkazuye na te sho vsi ekzemplyari Z zamineni na Y u X ce rizni tipi yaki ne peretinayutsya zi specialnimi terminovimi konstrukciyami yaki zazvichaj nazivayut roll i unroll zgortati i rozgortati sho utvoryuyut mizh soboyu izomorfizm Yaksho buti tochnim r o l l T m a T a m a T displaystyle roll T mu alpha T alpha to mu alpha T iu n r o l l m a T T m a T a displaystyle unroll mu alpha T to T mu alpha T alpha a ci dvi ye obernenimi funkciyami Ekvirekursivni tipi Vidpovidno do ekvirekursivnih pravil rekursivnij tip m a T displaystyle mu alpha T ta jogo rozgortannya T m a T a displaystyle T mu alpha T alpha rivni tobto ci dva virazi tipu rozumiyutsya yak odin i toj zhe tip Naspravdi bilshist teorij ekvirekursivnih tipiv jdut dali i po suti vkazuyut sho bud yaki dva virazi tipu z odnakovim neskinchennim rozshirennyam ekvivalentni V rezultati cih pravil ekvirekursivni tipi vnosyat znachno bilshu skladnist u sistemu tipiv nizh izorekursivni tipi Algoritmichni problemi taki yak perevirka tipu ta visnovok tipu ye skladnishimi takozh dlya ekvirekursivnih tipiv Oskilki pryame porivnyannya ne maye sensu dlya ekvirekursivnogo tipu yih mozhna peretvoriti v kanonichnu formu za chas O n log n yaku legko porivnyati Ekvirekursivni tipi ohoplyuyut formu samoreferencijnih abo vzayemno referencijnih viznachen tipiv sho sposterigayutsya u procedurnih ta ob yektno oriyentovanih movah programuvannya a takozh vinikayut u teoretichno tipovij semantici ob yektiv i klasiv U funkcionalnih movah programuvannya nabagato chastishe zustrichayutsya izorekursivni tipi pid viglyadom tipiv danih U sinonimah tipu Rekursiya ne dozvolena v sinonimah tipiv u Miranda OCaml yaksho ne vikoristovuyetsya praporec rectypes abo ce zapis chi variant ta Haskell tak napriklad taki tipi Haskell ye nezakonnimi type Bad Int Bad type Evil Bool gt Evil Natomist jogo potribno zagortati v algebrichnij tip danih navit yaksho vin maye lishe odin konstruktor data Good Pair Int Good data Fine Fun Bool gt Fine Ce tomu sho sinonimi tipiv yak typedefs v C zaminyuyutsya yih viznachennyam pid chas kompilyaciyi Sinonimi tipiv ne ye spravzhnimi tipami voni prosto psevdonimi dlya zruchnosti programista Ale yaksho ce bude zrobleno z rekursivnim tipom vono bude ciklichno neskinchenne oskilki nezalezhno vid togo skilki raziv psevdonim zamineno vin vse odno posilayetsya na sebe napriklad Bad bude rosti neskinchenno dovgo Bad Int Bad Int Int Bad Inshij sposib pobachiti ce polyagaye v tomu sho potriben riven oposeredkovanosti algebrichnij tip danih dlya togo shob sistema izorekursivnogo tipu mogla zrozumiti koli zgortati i rozgortati Div takozhRekursivne oznachennya Algebrichnij tip danih Vuzol informatika PrimitkiHarper 2000 Data Types Numbering Matters First Order Canonical Forms for Second Order Recursive Types CiteSeerX 10 1 1 4 2276 Cya stattya zasnovana na materiali vzyatomu z en do 1 listopada 2008 roku ta vklyuchenomu vidpovidno do umov relicenzuvannya GFDL versiya 1 3 abo piznishoyi