Рекурсивная функция — Википедия

Рекурсивная функция в теории вычислимости — функция, формализующая понятие рекурсии с вычислительной точки зрения; подразделяются на три последовательно входящих класса функций: примитивно рекурсивные, общерекурсивные и частично рекурсивные. Последние совпадают с классом вычислимых по Тьюрингу функций и занимают центральное место в логике и теоретической информатике, соответственно, при упоминании рекурсивных функций без уточнения обычно имеются в виду частично рекурсивные функции. Введены Куртом Гёделем.

Примитивно рекурсивная функция

[править | править код]

Определение примитивно рекурсивной функции является индуктивным. Оно состоит из указания класса базовых примитивно рекурсивных функций и двух операторов (суперпозиции и примитивной рекурсии), позволяющих строить новые примитивно рекурсивные функции на основе уже имеющихся.

К числу базовых примитивно рекурсивных функций относятся функции следующих трёх видов:

  • нулевая функция  — функция без аргументов, всегда возвращающая 0;
  • функция следования одной переменной, сопоставляющая любому натуральному числу непосредственно следующее за ним натуральное число ;
  • функция () от переменных, сопоставляющая любому упорядоченному набору натуральных чисел число из этого набора (например, ).

Операторы подстановки и примитивной рекурсии определяются следующим образом:

  • оператор подстановки (оператор суперпозиции) для функции  от переменных и упорядоченного набора функций от переменных каждая даёт функцию от переменных, сопоставляющую любому упорядоченному набору натуральных чисел число:
    ;
  • оператор примитивной рекурсии для функции от переменных и функции  от переменных дающий функцию от переменной вида:
    ,
    .

В данном определении переменную можно понимать как счётчик итераций,  — как исходную функцию в начале итерационного процесса, выдающего некую последовательность функций переменных, начинающуюся с , и  — как оператор, принимающий на вход переменных , номер шага итерации , функцию на данном шаге итерации, и возвращающий функцию на следующем шаге итерации.

Множество примитивно рекурсивных функций — минимальное множество, содержащее все базовые функции и замкнутое относительно операторов подстановки и примитивной рекурсии.

В терминах императивного программирования примитивно рекурсивные функции соответствуют программным блокам, в которых используется только арифметические операции, а также условный оператор и оператор арифметического цикла (оператор цикла, в котором число итераций известно на момент начала цикла). Если же программист начинает использовать оператор цикла while, в котором число итераций заранее неизвестно и, в принципе, может быть бесконечным, то он переходит в класс частично рекурсивных функций.

Например, примитивно рекурсивны функция сложения двух натуральных чисел ():

;
;

и функция умножения двух натуральных чисел ():

;
;
.

Примитивно рекурсивный функционал — обобщение понятия примитивно рекурсивной функции в многомерной теории типов.

Частично рекурсивная функция

[править | править код]

Частично рекурсивная функция определяется аналогично примитивно рекурсивной, только к двум операторам, суперпозиции и примитивной рекурсии, добавляется ещё третий оператор — минимизации аргумента, дающий для функции от переменных функцию от переменной, задаваемую следующим определением:

, при условии

(то есть функция возвращает минимальное значение последнего аргумента функции , при котором её значение равно 0).

Частично рекурсивные функции для некоторых значений аргумента могут быть не определены, так как оператор минимизации аргумента не всегда корректно определён, поскольку функция может быть не равной нулю ни при каких значениях аргументов. С точки зрения императивного программирования, результатом частично рекурсивной функции может быть не только число, но и исключение или уход в бесконечный цикл, соответствующие неопределённому значению.

Общерекурсивная функция

[править | править код]

Общерекурсивная функция — частично рекурсивная функция, определённая для всех значений аргументов. Задача определения того, является ли частично рекурсивная функция с данным описанием общерекурсивной или нет, алгоритмически неразрешима.

Пример общерекурсивной функции, не являющейся примитивно рекурсивной — функция Аккермана. Другой пример общерекурсивной функции, не являющейся примитивно рекурсивной, строится диагональным методом Кантора из универсальной функции для множества одноместных примитивно рекурсивных функций.

Литература

[править | править код]
  • Гильберт Д., Бернайс П. Основания математики. — М.: Наука, 1979. — Т. 1.
  • Клини С. К. Введение в метаматематику. — М.: Иностранная литература, 1957.
  • Мальцев А. И. Алгоритмы и рекурсивные функции. — М.: Наука, 1986.
  • Петер Р. Рекурсивные функции . — М.: Иностранная литература, 1954.
  • Н. К. Верещагин, А. Шень. Лекции по математической логике и теории алгоритмов. — 2-е изд., исправленное. — М.: МЦНМО, 2002. — Т. 3. Вычислимые функции.