Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
История информационных технологий I.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
8.02 Mб
Скачать

13.4.Рекурсивные функции

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

Включим все условия задачи, доступные для переработки конкретным алгоритмом Alg, в занумерованную неотрицательными числами последовательность:

A0,A1,…An,… (43)

Аналогично, записи возможных решений включим в занумерованную неотрицательными числами последовательность:

B0,B1,…,Bm,… (44)

Очевидно, что выполнение алгоритма Alg можно свести к вычислению значений некоторой целочисленной функции:

m = Falg(n) (45)

Теперь можно говорить, что вычислительный алгоритм Alg преобразует номер записи условий в номер записи решения.

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

Если алгоритм Alg записан в виде целочисленной функции (45), то решение прикладной задачи происходит следующим образом:

определяется гёделевский номер n исходных данных An;

вычисляется значение m функции (45);

по гёделевскому номеру m определяется набор результирующих данных Bm.

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

Функция вида y = (x1,x2,…,xn) называется целочисленной функцией, если как аргументы, так и сами функции могут принимать значения из множества {0,1,2,…}. Логические функции являются частным случаем целочисленных функций.

Элементарная целочисленная функция получается из неотрицательных натуральных чисел и переменных с помощью конечного числа сложений, арифметических вычитаний (под арифметическим вычитанием подразумевается абсолютная величина (|x-y|), умножений, арифметических делений ( под арифметическим делением понимается целая часть частного [a/b] при b  0) и построений сумм и произведений.

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

В качестве исходного числа для построения элементарных функций можно взять число 1, ибо

0=|1-1|, 2=1+1, 3=(1+1)+1 и т.д.

Примеры.

(x)x+1, (y)12y, (a,b,c)ab+c, b2

= min(x,1)

Из всех целочисленных элементарных функций быстрее всего растет произведение. Умножение есть итерация сложения. Возведение в степень, в свою очередь, есть итерация умножения:

an = aa…a ()

Эта функция является еще элементарной, так как она выражается через произведение. Растет эта функция с ростом a и n достаточно быстро. Построим еще более быстро растущую функцию, являющуюся итерацией возведения в степень:

(0,a)=a, (1,a)=aa, (2,a)= ,…,  (n+1,a)=a(n,a) (46)

Эта функция растет чрезвычайно быстро. Можно доказать, что с помощью построения элементарных функций уже невозможно "угнаться" за ростом функции (n,a). Говоря другими словами, эта функция мажорирует все целочисленные элементарные функции. Таким образом, итерация возведения в степень позволяет получить неэлементарную функцию. Тем не менее, эта функция вычислима.

Пусть необходимо вычислять значение (n,a) при любых значениях n=n*, a=a*. Общую формулу для определения функции (n,a), при заданном значении a* аргумента a, можно записать в виде:

 (n+1,a*) = (a*) (n,a*) (47)

Обозначим (a*)m =(m); (m) – целочисленная элементарная, всюду однозначная вычислимая функция. Алгоритм ее вычисления сводится к повторному m раз умножению на a*. Запись:

 (n+1,a*) = ((n,a*)) (48)

связывает значение функции  в следующей точке с ее значением в предыдущей точке. Достаточно задать начальное значение  (0,a*) = a*, чтобы получить вычислительную процедуру, дающую последовательные значения:

 (1,a*) = ((0,a*)) = (a*) (49)

 (2,a*) = ((1,a*)) = ((a*))

Этот процесс следует продолжать до тех пор, пока не будет достигнуто значение (n*,a*).

Из предыдущего примера следует вывод, что класс целочисленных элементарных функций должен быть расширен.

Класс целочисленных элементарных функций расширяется за счет введения примитивно-рекурсивных функций. Различаются понятия примитивно-рекурсивной функции и описания примитивно-рекурсивной функции.

Описанием примитивно-рекурсивной функции (x1,x2,…,xn) называется такая последовательность функций 1,2,…k, что каждая функция из этой последовательности является или базисной или непосредственно зависящей от предыдущих функций последовательности, а последняя функция k есть .

Определению примитивно-рекурсивной функции может быть придана следующая форма. Фиксируется небольшое число чрезвычайно простых базисных целочисленных функций (1-3):

(x) = x+1 – функция следование;

(x1,x2,…,xn) = q – функция константа;

(x1,x2,…,xn) = xi – функция тождества.

Фиксируется также небольшое число операторов, переводящих вычислимые функции снова в вычислимые (4-6).

(x1,x2,…,xn) = (1((x1,x2,…,xn),2((x1,x2,…,xn),…, 1((x1,x2,…,xm)) – схема подстановки;

(0)=q; операторы определения по индукции.

(x+1)=(x,(x))

Примитивно-рекурсивные функции - такие функции, которые можно получить из базисных функци1 (1-3) в результате конечного числа применений операторов (4-5).

Нетрудно показать, что целочисленные элементарные функции являются частным случаем примитивно-рекурсивных функций.

Пример. Определим функцию (y,x) таким образом:

(0,x) = x;

(y+1,x) = (y,x)+1

Согласно этой схеме имеем:

(1,x) = x+1;

(2,x) = (1,x)+1 = x+2;

(3,x) = (2,x)+1 = x+3;

и вообще:

(y,x) = x+y

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

Подробное изложение теории рекурсивных функций выходит за рамки данного издания.

Резюме.

Рекурсивные функции вычислимы по определению.

Тезис Черча: если функция может быть представлена в виде частично рекурсивной функции – она вычислима.

[Айзерман, Л.А. Гусев и др.Гос. изд-во ф.м. л-ры, М.: 1960]