Termenul de funcție recursivă în teoria computabilității este folosit pentru a se referi la trei clase de funcții:
Acestea din urmă coincid cu clasa de funcții calculabile Turing . Definițiile acestor trei clase sunt strâns legate. Ele au fost introduse de Kurt Gödel pentru a oficializa noțiunea de computabilitate.
Setul de funcții recursive parțial include setul de funcții recursive generale, iar funcțiile recursive generale includ funcții recursive primitive. Funcțiile parțial recursive sunt uneori denumite pur și simplu funcții recursive.
Definiția conceptului de funcție recursivă primitivă este inductivă . Constă în specificarea unei clase de funcții recursive primitive de bază și a doi operatori ( suprapunere și recursivitate primitivă ) care permit construirea de noi funcții recursive primitive pe baza celor existente.
Funcțiile recursive primitive de bază includ următoarele trei tipuri de funcții:
Operatorii de substituție și recursivitate primitivă sunt definiți după cum urmează:
În această definiție, o variabilă poate fi înțeleasă ca un numărător de iterații, — ca o funcție inițială la începutul procesului de iterație, emitând o anumită secvență de funcții ale variabilelor, începând cu , și — ca un operator care acceptă ca variabile de intrare , numărul pasului de iterație , o funcție la un pas de iterație dat și funcția de revenire la pasul următor al iterației.
Setul de funcții recursive primitive este setul minim care conține toate funcțiile de bază și este închis sub operatorii de substituție și recursivitate primitive specificați.
În ceea ce privește programarea imperativă , funcțiile recursive primitive corespund blocurilor de program care utilizează numai operații aritmetice, precum și un operator condiționat și un operator de buclă aritmetică (un operator de buclă în care numărul de iterații este cunoscut în momentul începerii buclei). Dacă programatorul începe să folosească operatorul buclă while, în care numărul de iterații nu este cunoscut în prealabil și, în principiu, poate fi infinit, atunci trece în clasa funcțiilor parțial recursive.
Să subliniem o serie de funcții aritmetice binecunoscute care sunt primitiv recursive.
O funcție parțial recursivă este definită în mod similar cu una primitivă recursivă, doar la doi operatori, suprapunere și recursiune primitivă, se adaugă un al treilea operator - minimizarea argumentului.
Este posibil ca funcțiile parțial recursive pentru unele valori ale argumentului să nu fie definite, deoarece operatorul de minimizare a argumentului nu este întotdeauna definit corect, deoarece funcția poate să nu fie egală cu zero pentru orice valoare a argumentului. Din punct de vedere al programării imperative, rezultatul unei funcții parțial recursive poate fi nu doar un număr, ci și o excepție sau o buclă infinită corespunzătoare unei valori nedefinite.
O funcție recursivă generală este o funcție parțial recursivă definită pentru toate valorile argumentului. Problema de a determina dacă o funcție parțial recursivă cu o descriere dată este recursivă generală sau nu este algoritmic indecidabilă .
Este ușor de înțeles că orice funcție recursivă primitivă este parțial recursivă, deoarece prin definiție operatorii pentru construirea de funcții parțial recursive includ operatorii pentru construirea funcțiilor recursive primitive.
De asemenea, este clar că o funcție recursivă primitivă este definită peste tot și, prin urmare, este o funcție recursivă generală (o funcție recursivă primitivă nu are niciun motiv să se „atârneze”, deoarece construcția sa folosește operatori care definesc funcții definite peste tot).
Este destul de dificil să dovedești existența și să dai un exemplu de funcție recursivă generală care nu este recursivă primitiv. Un exemplu popular este funcția Ackermann . Un alt exemplu de funcție recursivă generală care nu este recursivă primitivă este construit prin metoda diagonală a lui Cantor dintr-o funcție universală pentru un set de funcții recursive primitive unare.
După cum a arătat Gödel , funcțiile parțial recursive coincid cu setul de funcții calculabile .
Termenii „funcție recursivă parțial” și „funcție recursivă generală” au prins rădăcini din motive istorice și sunt în esență rezultatul unei traduceri inexacte a termenilor englezi „funcție recursivă parțială ” și „funcție recursivă totală” , care sunt traduși mai corect ca „funcții recursive definite”. pe părți ale setului de argumente posibile” și „funcții recursive definite pe întregul setul de argumente posibile”. Adverbul „parțial” nu se referă la adjectivul „recursiv”, ci la sfera funcției. Poate că un nume mai corect ar fi „funcții recursive parțial definite” și pur și simplu „funcții recursive definite oriunde”. Dar numele lungi nu au prins rădăcini.