Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
GOSY / 2 блок-все.doc
Скачиваний:
304
Добавлен:
09.05.2015
Размер:
4.17 Mб
Скачать

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

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

Как известно, величину w называют функцией, а величины x1,x2,…,xn

аргументами, или независимыми переменными, если известен закон, ко­торый для различных наборов конкретных значений величин x1,x2,…,xn задает определенные значения величины w. При этом для каждого набора допускается одно-единственное значение функции. В частном случае функция может иметь одно независимое переменное (аргумент). Что за за­кон применяется для определения функции? Математика не накладывает никаких ограничений на него. Она допускает любой мыслимый закон. Но таким законом может быть некоторый алгоритм. В этом случае функцию называют вычислимой, так как имеется способ получения ее значений. Рекурсивными функциями называют один частный класс вычислимых функций. Алгоритмы, являющиеся законами их задания, мы будем назы­вать алгоритмами, сопутствующими рекурсивным функциям.

По Черчу числовая функция называется рекурсивной, если она отно­сится к одному из двух классов:

1.Базовым рекурсивным функциям (алгоритм получения таких функций считается очевидным)

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

Замечание. В первой редакции данного определения оператор минимизации отсутствует.

Кроме того, что рекурсивные функции принято делить на общерекурсивные (полученные с помощью оператора суперпозиции и примитивной рекурсии) и частично рекурсивные (полученные с помощью опера­тора минимизации)

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

Базовые функции Базовые функции бывают трех типов:

1. Функции любого числа независимых переменных, тождественно равные нулю. Для краткости будем называть их «тождественный ноль» Их будем обозначать φn, где п — число аргументов. Например, к числу таких функций относятся у= φ1(x), w3(x, у, z), wn(x1,x2,…,xn). Сопутствующий алгоритм для этих функций гласит: «Если функ­циональный знак имеет вид φn, то любой совокупности значений аргу­ментов данной функции ставится в соответствие ее значение 0».

Напри­мер, f(x)=x-x, может быть обозначение: φ(x)=x-x≡0.

Будем считать, что п может быть равно нулю, т. е. что возможна функция этого вида, не зависящая ни от одного аргумента. Эта функ­ция равна 0. Обозначим ее φ0(), или, для краткости, φ0.

2. Функции любого числа независимых переменных, тождественно равные одному из аргументов. Обозначим их ψn,i где п — число аргументов, i — номер одного из аргументов 1<i<n). Сопутствующий этим функциям алгоритм гласит: «Если функциональный знак имеет вид ψn,i, то значением функций считать значение i-го (считая в функциональной записи слева направо) независимого переменного».

Например: ψ1,3(x,y,z)=x.

Для тождественных функций ни n, ни i не может быть равно нулю.

3. Функции следования (иначе — получения последователя) одного независимого переменного. Обозначим их с помощью функционального знака λ(х). Сопутствующий этим функциям алгоритм гласит: «Если функциональный знак имеет вид λ(х), то значением функции считать число, непосредственно следующее за числом, являющимся значением аргумента». Операция «получения последователя», по-видимому, проще сложения. Дети сначала учатся считать, а потом уже овладевают сложе­нием. Первобытные люди тоже сначала овладели счетом, и лишь много позже возникла идея сложения чисел. Это вполне естественно, так как в ту пору числа изображали как последовательности черточек (зарубок). Последователь получали, добавляя еще одну зарубку.

Например: λ(х)=x+1; λ(3)=3+1=4.

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

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

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

В теории рекурсивных функции особое значение имеют три следую­щих оператора: Оператор суперпозиции, оператор примитивной рекурсии и оператор минимизации.

Оператор суперпозиции или подстановки.Слова суперпозиция и подстановка в данном случае имеют одно и то же значение. Этот оператор по функции F от п аргументов и по функциям f1,f2,…,fn строит новую функцию Ф такую, что для нее справедливо тождест­во Ф≡F(f1,f2,…,fn).

Алгоритм, сопутствующий этому оператору, гласит: «Значения функций f1,f2,…,fn принять за значения аргументов функции F и вычислить ее зна­чение». Оператор подстановки (суперпозиции) обозначим буквой С. Построение функции Ф из функций F и fi с помощью оператора суперпозиции будем записывать так: Ф=С(F,f1,f2,…,fn).

Алгоритм построения суперпозиции (для двух функций).

1. Выбираются две функции f, g.

2. Определяется аргумент xk первой функции f, для которой будем осуществлять подстановку.

3. Подставляем значение аргумента в g и вычисляем её значение go.

4. xk=go.

5. fo=f(x1,x2,…,xn)

Например, если в качестве F принять λ(х), а в качестве f1 взять функцию λ(у), то с помощью операции суперпозиции получим функцию τ(у) = λ(λ(у)). Правило суперпозиции Суперпозиция двух рекурсивных функций является рекурсивной функ­цией.

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

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

Пример: F(x,y)=x+y и даны две функции g(x), f(x). Построим суперпозицию: Ф=C(F,g(x),f(y))=g(x)+f(y).

Оператор примитивной рекурсии. Этот оператор по двум функциям, одна из которых имеет п-1 неза­висимых переменных, а другая, кроме указанных независимых перемен­ных, имеет еще два (т. е. зависит от п+1 переменных), строит функцию n независимых переменных. Один из дополнительных аргументов войдет вместе с аргументами первой функции в число аргументов вновь получаемой функции, а другой играет вспомогательную роль при выполнении оператора рекурсии. Оператор рекурсии будем обозначать Пр; его приме­нение будем записывать в виде строки: f= Пр,ψ), где f означает получаемую функцию, φ — функцию п—1 независимых пе­ременных, ψ — функцию п+1 независимых переменных.

При описании существа оператора рекурсии удобно не указывать ар­гументов первой из заданных функций ни в ее функциональной записи, ни в записях двух других функций, подразумевая эти аргументы. Тогда мож­но сказать, что оператор рекурсии задает функцию с помощью двух усло­вий, в которые входят функции φ и ψ. Алгоритм, сопутствующий операто­ру рекурсии, гласит: «Значением получаемой функции для нулевого зна­чения главного дополнительного аргумента считать значение исходной функции п -1 аргументов; значением определяемой функции для каждо­го последующего значения главного аргумента считать значение второй из заданных функций при предыдущем значении главного аргумента и при значении вспомогательного аргумента, совпадающем с предыдущим зна­чением определяемой функции».

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

1. f(x1,x2,…,xn-1 ,0) = φ(х12,…,xn-1).

2. f(x1,x2,…,xn-1 ,y+1)= ψ(x1,x2,…,xn-1 ,y,f( x1,x2,…,xn-1, y )).

При этом, f(x1,x2,…,xn-1 ,y+1)=C(ψ(x1,x2,…,y,xn+1),f( x1,x2,…,xn-1, y)).

Алгоритм построения примитивной рекурсии:

1. Выбираем две функции φ и ψ, у которых количество аргументов п-1 и п+1 соответственно;

2. Определяем значение для п-1 аргумента и фиксируем значение хп (п-го аргумента), это будет у;

3. Выбираем значение у=0;

4. Вычисляем f(x1,x2,…,xn-1 ,0) = φ(х12,…,xn-1);

5. Увеличиваем у на 1 и получаем функцию

ψ(x1,x2,…,xn-1 ,y,f( x1,x2,…,xn-1, y ))= f(x1,x2,…,xn-1 ,y+1).

Правило примитивной рекурсии Если заданы две рекурсивные функции (φ от п-1 аргумена и ψ от п+1 аргумента, то построенная с их помощью примитивная рекурсия даст тоже рекурсивную функцию.

Примеры: I. Доказать рекурсивность функции f(x,y)=x+y.

1. f(x,0)=xрекурсивна, как базовая.

2. f(x,y+1)=x+(y+1)=x+y+1=z+1 – базовая, как функция следования.

z+1=ψ(x,y,z)= ψ(x,y,f(x,y))=(x+y)+1=x+(y+1)=f(x,y+1).

II. Доказать рекурсивность функции f(x,y)=xy.

1. f(x,0)=x0=1=λ(0) – рекурсивна, как базовая.

2. f(x,y+1)=xy+1=xy٠x=z٠xрекурсивная.

ψ(x,y,z)=x٠z; ψ(x,y, f(x,y))=z٠x= xy٠x= xy+1= f(x,y+1).

Оператор построения по первому нулю

Этот оператор называют обычно оператором наименьшего числа, а в некоторых книгах — оператором минимизации; Этот оператор по за­данной функции, зависящей от n+1 аргументов, строит новую функцию от n аргументов. Исчезающий аргумент является вспомогательным и ис­пользуется при выполнении оператора. Обозначают оператор построения по первому нулю буквой μ, его применение обозначают строкой вида f::= μ[f1;(x)], где x — исчезающий аргумент. С помощью оператора построения по первому нулю получают функцию f, значения которой определяются при выполне­нии сопутствующего ей алгоритма, который гласит: «Придавать вспомога­тельному аргументу последовательные значения, начиная с 0, до тех пор, пока не окажется, что функция f стала (в первый раз) равной нулю. Полу­ченное значение вспомогательного аргумента принять за значение опреде­ляемой функции, соответствующее тем значениям основных аргументов, при которых осуществлялся описанный процесс».

Другими словами, пусть дана функция f(x1,x2,…,xn). Выберем одну из переменных хк и назовем её у. Получим f(x1,x2,…,xk-1,y,xk+1…,xn)=f(x,y).

Пусть задано уравнение f(x,y)= 0. Найдем корень этого уравнения относительно у при фиксированном значении х. Возможны три ситуации:

1. Нет ни одного корня для натурального значения у,

2. Существует один корень при натуральному;

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

1. выбираем y=0;

2. проверяем равны ли нулю значения функции f при заданном у. Если рав­ны, то у - первый корень и выходим из алгоритма. Если у≠0, то перехо­дим к следующему пункту;

3. увеличиваем у на единицу, у=у+1;

4. возвращаемся к пункту 2).

Если функция имеет конечный корень среди натуральных чисел, то алгоритм обязательно даст результат. Если корней несколько, то обязательно будет найден самый меньший среди натуральных корней. Пользуясь данным алго­ритмом поиска корня, можно построить функцию g(x1,x2,…,xk-1,xk+1…,xn). Запишем алгоритм построения функции g.

1) фиксируем значение переменных x1,x2,…,xn;

2) строим некую функцию f, к которой будет добавлена переменная хк;

3) определяем, имеет ли относительно этой переменной функция/натураль­ный корень. Если корней нет, то при данных значениях функция g не оп­ределена. Если корни есть, то находим минимальный корень у. Этот ко­рень и есть искомое значение функции g, g=y.

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

Функция, полученная по приведенному выше алгоритму, обозначается

g(x1,x2,…,xk-1,xk+1…,xn)= μ[f(x1,x2,…,xk-1,xk+1…,xn);y].

Построим μ[f(x,y);y] для f(x,y) = x-y+1. Очевидно, что данная функция равна нулю при

у = х-1, следовательно g(x) = х-1, при этом функция g не определена при х=0. То есть, μ[f(x,y) = х-у+1, у]=х-1.

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

Для примера в качестве f1 возьмем базовую функцию ψ2,1(x,y).

f=μ[ψ2,1(x,y),(x)]. Оператор для данной функции определен только в одной (.)x=0: ψ2,1(0,y)=0.

f=μ[ψ2,1(x,y),(y)], здесь ψ2,1(x,0)=x.

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

Сформулируем правило минимизации.

Если функция получена с помощью минимизации рекурсивной функ­ции, то она частично рекурсивна, если функция получена с помощью оператора минимизации из частично рекурсивной функции, то она так же частично рекурсивна.

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

Изучая рекурсивные и частично рекурсивные функции, можно сформу­лировать ещё один тезис.

Тезис Черча: Любая всюду определенная вычислимая числовая функ­ция является общерекурсивной. И, наоборот, если всюду определенная числовая функция не является общерекурсивной, то она невычислима.

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

Основной тезис.

Каков бы ни был алгоритм, перерабатывающий наборы целых не­отрицательных чисел в целые неотрицательные числа, существует алгоритм, сопутствующий рекурсивной функции, который ему экви­валентен.

Тезис Клини: Любая вычислимая, но не всюду определенная числовая функция является частично рекурсивной. Если частично определенная чи­словая функция не является частично рекурсивной, то она невычислима.

Интересную форму этой гипотезе, вернее интересное ее обобщение, сделали советские ученые А. Н. Колмогоров и В. А. Успенский. Предполо­жим, что нам задан некоторый алгоритм в интуитивном смысле. На практи­ке всегда удается найти способ нумерации его допустимых исходных дан­ных, а также другой способ нумерации даваемых им результатов. Соответст­вие номеров исходных данных номерам результатов, устанавливаемое нашим алгоритмом (в интуитивном смысле), всегда совпадает с соответствием между значениями аргумента и значениями некоторой рекурсивной функ­ции от одного независимого переменного. Это значит, что выполнение ал­горитма в определенном смысле эквивалентно вычислению значения рекурсивной функции. Это значит, кроме того, что невозможность рекурсивной функции означает и невозможность алгоритма (так как для каждого алго­ритма должна быть рекурсивная функция, а ее-то в данном случае и нет).

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

Соседние файлы в папке GOSY