Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
8_2.doc
Скачиваний:
46
Добавлен:
14.03.2016
Размер:
327.17 Кб
Скачать

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

Как известно алгоритм дает процедуру отыскания значений вычислимой функции. Но как отличить вычислимую функцию от невычислимой? Как традиционным математическим языком списать общий вид вычислимых функций. Для этого поступим так:

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

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

  2. Произведем (мысленно) все возможные операции из п. 2 над базовыми функциями из п. 1, по-разному комбинируя их в качестве аргументов, расширим набор функций Р путем включения туда вновь полученных функций; над новым набором Р вновь произведем все возможные операции из набора О, получим новые функции, которые вновь включим в множество Р и т. д.

Поскольку не ограничиваем сверху количество исполнений п. 3, то, таким образом, будем получать все новые и новые функции. Иначе говоря, пп.1-3 описывают построение некоторого бесконечного множества функций. Однако каждая конкрет­ная функция f из этого множества является результатом вы­полнения конечного числа операций, взятых из набора О над базовыми функциями. Таким образом, процесс построения f:

  1. начинается с исходных данных, выбираемых из базового набора;

  1. выполняется пошагово (в дискретном времени);

  1. на каждом шаге выполняется одна из элементарных опера­ций (из набора О);

  1. результат каждого шага строго определен;

5) процесс заканчивается через конечное число шагов. Этот перечень дает нам возможность говорить об алгоритме

af построения функции f. Заметим, что мы не вносим саму функцию f в перечень исходных данных, т. е. не говорим об «универса­льном» алгоритме построения функции. Напротив, для раз­личных функций f1 и f2 алгоритмы будут различны. Более того, свойство массовости алгоритмов не выполняется, исходные дан­ные всегда одни и те же — базовый набор функций. Это позволя­ет говорить о том, что текст алгоритма (последовательность при­менения операций из О и места подстановок в эти операции операндов из базового набора) задает единственную функцию, а не множество функций. Тогда легко преобразовать алгоритм af построения функции в алгоритм вычисления значений функ­ции f(x1, х2, ..., хп) введением и использованием в тексте исходных данных x1, х2 ..., хn.

Введем сейчас конкретные базовый набор функций Р и систему операций О для формирования множества функций. В качестве области определения функций возьмем n-кратное декартово произве­дение множества неотрицательных целых чисел. Сами функции, как и их аргументы также принимают значения из множества не­отрицательных целых чисел. Таким образом, мы обеспечиваем возможность, хотя бы потенциальную, вычислять значения функ­ций с помощью машин Тьюринга.

Базовый набор функций. Р = { 0(х), S(x), Inm (x1, x2, ..., хп )}. Эти функции рассматривались и для них были постро­ены машины Тьюринга, вычисляющие их значения по значениям аргументов. Таким образом, этот набор удовлетворяет выдвину­тым выше требованиям.

Система операций. В систему операций О входят три операции: суперпозиции , примитивной рекурсии  и минимизации .

1. Операция суперпозиции , получая n+1 операнд функции f0, f1, …,fn, производит результат f=  (f0, f1, …,fn). Считая все функции зависящими от одного и того же набора аргументов (можно просто объединить наборы аргументов всех участвую­щих в операции функций в один набор и, если j-я функция ранее не зависела от i- го аргумента, то мы считаем этот аргумент несу­щественным для данной функции), можем задать формулу для вычисления значений вновь образованной функции f:

f(x1, x2, …, xn) = f0(f1 (x1, x2, …, xk), …, fn (x1, x2, …, xk)),

где k — количество переменных в объединенном наборе перемен­ных функций с индексами от 1 до п.

Первый операнд (функция f0) операции суперпозиции играет отличающуюся от других операндов роль — он задает формиро­вание сложной функции. Поэтому аргументы функции f0 не вхо­дят в перечень аргументов результата операции суперпозиции, но количество их должно быть равно п. Это требование не огра­ничивает применимость операции суперпозиции, так как при бо­льшем (> п) количестве аргументов функции f0, мы всегда можем расширить перечень операндов операции σ, добавив необходи­мое количество тождественных функций; тогда часть аргументов f0 перейдет в состав аргументов функции-результата.

Все рассматриваемые функции являются частичными, т. е. не всюду определенными; могут существовать такие комбинации значений аргументов, для которых значение функции не сущест­вует. Например, функция f(x) = х/2 определена только на подмно­жестве четных значений аргумента; функция f(x) = х - 3 не опреде­лена для значений аргумента, равных 0, 1, 2. В таких случаях и функция-результат f операции суперпозиции не существует для некоторых комбинаций значений аргументов. Точнее, f1, а2, ..., аk) не существует, если не существует хотя бы одно из значений f11, а2, ..., аk), fn1, а2, ..., аk) или, если эти значения суще­ствуют и равны b1,…,bn, то не существует значение f0(b1,..., bn). Таким образом, функция f также является частичной. Подобные замечания можно сделать и в отношении следующих двух опера­ций.

2. Операцияпримитивной рекурсии имеет два операнда, f = = (g, h). Первый операнд, функция g, зависит от п аргументов, п > 0, а второй операнд, функция h, имеет в общем случае два дополнительных аргумента, хотя в том и другом случае некото­рые аргументы могут быть несущественными. Функция-резуль­тат f определяется следующими уравнениями примитивной ре­курсии:

Здесь рекурсия производится по последнему аргументу функции f: ее значение при аргументе у+1 вычисляется через ее же значение при аргументе, равном у, которое, в свою очередь, вы­числяется через значение функции f при аргументе, равному y-1, и так далее до значения аргумента, равного 0, при котором про­цесс определения через себя (возвратный процесс, процесс рекур­сии) заканчивается.

Можно, наоборот, процесс вычисления значения f(x1, х2, ..., хn, у) начинать всегда с 0, получая значение в соответствии с пер­вым уравнением (начальным условием), а затем в соответствии со вторым уравнением вычислять значения функции при аргу­ментах, равных 1, 2, 3, ... и т. д. до достижения значения у (итера­ционный процесс).

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

1. Сложение неотрицательных целых чисел,Add(x, у)= х + у задается следующими уравнениями:

Здесь функция g(x)=I11(х)=х —тождественная функция, а функция h = S зависит существенным образом только от последнего своего аргумента, а именно, от Add(x,y).

  1. УмножениеMult(x,y) = x*y задается уравнениями

которые используют уже построенную функцию сложения чисел и известные соотношения x*0 = 0,х* (у + 1) = х + х*у.

3. Возведение в степень Роwеr(x, у) = xy. Уравнения имеют вид

4.Всюду определенное уменьшение на единицу, т. е. функция, которую можно задать следующими соотношениями (не рекур­сивно):

Уравнения с использованием примитивной рекурсии и супер­позиции задают эту функцию в виде

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

Класс функций, получаемых из базовых применением конеч­ного числа операций двух типов — суперпозиции и примитив­ной рекурсии, называется классом примитивно-рекурсивных функций Рпр. В этот класс, кроме приведенных выше, входят мно­гие функции. Их общим свойством является то, что они всюду определены.

Далеко не все функции, значения которых могут быть вычис­лены, относятся к классу примитивно-рекурсивных функций. В операции  рекурсия производится по одной переменной. Если построить схему с рекурсией по двум переменным (двойная ре­курсия, рекурсия 2-й ступени), то с ее помощью будут получаться функции, не принадлежащие в общем случае классу примитив­но-рекурсивных. В качестве примера можно привести известные функции Аккермана, определяемые соотношениями

B(0, у) = 2 + y,

В(х+ 1, 0) = sg(x),

В(х + 1, у + 1) = В(х, В(х + 1, у)),

А(х) = В(х, х).

Здесь sg(x) — функция, значение которой равно нулю при x = 0 и равно единице в противном случае. В определении функ­ции В(х, у) рекурсия введена по обеим переменным. Эти соотно­шения позволяют вычислить значения функции В и, следователь­но, функции А для любых значений переменных. В теории алгоритмов доказано, что функция Аккермана А(х) растет быст­рее, чем любая примитивно-рекурсивная функция. Точнее, для любой одноместной примитивно-рекурсивной функции f{x) най­дется такое п. что для любого х > п имеет место А(х) > f(x). Следо­вательно, А(х) не является примитивно-рекурсивной.

Приведенный пример показывает, что двух операций, супер­позиции и примитивной рекурсии, недостаточно для описания вычислимых функций. Даже введение кратной рекурсии не реша­ет проблемы: для любого k найдется функция, которую можно определить с помощью рекурсии по k переменным, но нельзя определить с помощью рекурсии по k- 1 переменной (k-рекурсив-ная, но не (k-1)-рекурсивная).

3. Операция минимизации имеет один операнд, f=  (g). Зна­чения функции f на заданном наборе аргументов х1, х2, ..., хn по­лучаются следующим образом. Сначала с помощью функции g формируется уравнение g(x1, х2, ..., хn-1 , у) = хn, а затем отыскива­ется его решение относительно переменной у. Если таких реше­ний несколько, то берется минимальное из них (отсюда и назва­ние операции); оно и считается значением функции / на дан­ном наборе аргументов, f(х1, х2, ..., хn). Операцию минимизации обычно записывают с помощью оператора минимизации у в виде f(х1, х2, ..., хn) = y(f(х1, х2, ..., хn-1, y)) = хn, Может случиться, что уравнение не имеет ни одного решения. В этом случае счита­ется, что функция f не определена на заданном наборе ар­гументов.

В качестве примера можно рассмотреть функцию Dec =  (S), где S(x) — функция из базового набора, S(x) = х + 1. Соответству­ющее уравнение имеет вид S(y) = х и оно имеет решение у = х - 1 при х > 0 и не имеет решения при х = 0. Следовательно, Dec(x) = х - 1 при х > 0 и Dec(0) не существует.

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

Приведенный пример показывает, что оператор минимизации может превратить всюду определенную функцию в частичную, т. е. выводить за пределы множества примитивно-рекурсивных функ­ций. Множество функций, получаемых применением кбазовому набору Р конечного числа операций типа суперпозиции, при­митивной рекурсии и минимизации называется множе­ством частично-рекурсивных функций и обозначается Рчр.

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

Pпр Pр Pчр Pч

где Рч — множество всех частичных функций.

В частности, приведенные выше функции Аккермана являют­ся общерекурсивными.

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

  1. Класс Ряыч замкнут относительно операции суперпозиции . Иными словами, если в качестве операндов операции суперпози­ ции взять вычислимые функции, то результат обязательно будет вычислимой функцией.

  2. Класс Рвыч замкнут относительно операции примитивной рекурсии .

3. Класс Рвыч замкнут относительно операции минимизации . Следствием этих трех утверждений является вложение

Рчр Рвыч

4. Всякая функция, вычислимая на машине Тьюринга, частич­но-рекурсивна.

Более того, существует теорема Клини о нормальной форме: Любая вычислимая функция f(х1, х2, ..., хn) представима в форме

f(х1, ..., хn) = Ff (х1, х2, ..., хn, y (Gf(х1, х2, ..., хn,y) = 0)),

где Ff, Gf — примитивно-рекурсивные функции.

Из четвертого утверждения следует, что Рвыч Рчр. Таким об­разом, классы частично-рекурсивных функций и функций, вычис­лимых машинами Тьюринга, совпадают: Рчр = Рвыч.

Вспомним, что класс вычислимых по Тьюрингу функций в со­ответствии с тезисом Тьюринга является формализацией нечетко очерченного класса алгоритмически (в интуитивном смысле) вы­числимых функций. Тогда можно вслед за А. Черчем сформули­ровать следующий тезис: «Класс алгоритмически (или машинно) вычислимых частичных функций совпадает с классом всех частично-рекурсивных функций».

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Оставленные комментарии видны всем.