русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Рекурсия — это способ описания функций или процессов через самих себя.


Дата добавления: 2015-01-16; просмотров: 1719; Нарушение авторских прав


Процесс может быть описан некоторым алгоритмом, назы­ваемым в данном случае рекурсивным. В нем выделяется два этапа выполнения:

1) «погружение» алгоритма в себя, т. е. применение опреде­ления «в обратную сторону», пока не будет найдено начальное определение, не являющееся рекурсивным;

2) последовательное построение от начального определения до определения с введенным в алгоритм значением.

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

1. Наиболее распространенным рекурсивным определением является определение факториала (нерекурсивное вычисление факториала приведено в примере Р9): (a) 1! = 1, (b) n > 1, n: = n*(n - 1)!

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

programР25;

varn, у:integer;

functionF (x: integer): integer; {описание рекурсивной функции}

Begin

if x=1

then F: = 1 {вызов для начального определения}

else F: = х * F (х - 1) {вызов для предыдущего определения}

end; {конец описания функции}

begin {начало главной программы}

readln(n);

Y: = F (n); {вызов функции в главной программе}

write (n, ‘! = ‘, Y)

end. {конец главной программы}

Выполним программу Р25 для n = 4. Рекурсивная функция будет работать следующим образом (при вызове функции зна­чение n присваивается переменной х). Сначала осуществляет­ся «погружение», работает оператор ветвиelse условного опе­ратора:

1-й шаг: х = 4, х-1 = 3, выполняется промежуточное вы­числение 4! = 4 * З!

2-й шаг: х = 3, х-1 = 2, выполняется промежуточное вы­числение З! = 3 * 2!

3-й шаг: х = 2, х-1 = 1, выполняется промежуточное вы­числение 2! = 2 * 1!

4-й шаг (последний): 1! = 1 по начальному определению, работает оператор F: = 1 ветвиthen условного оператора.

Следующий этап выполнения рекурсивного алгоритма — построение «прямого» определения, от начального до полу­чения результата с исходными для алгоритма данными (числом 4). При этом осуществляется подстановка предыду­щих вычислений (более поздних шагов) в более ранние:



5-й шаг: 2! = 2 * 1 = 2

6-й шаг: З! = 3 * 2 = 6

7-й шаг: 4! = 4 * 6 = 24 — получен результат, он возвраща­ется в главную программу и присваивается переменной Y.

2. Вычисление степени с натуральным показателем можно определить рекурсивно:

(a) x 0 = 1

(b) k > 0: xk = x* xk - 1

Этому определению соответствует рекурсивная функция power (k, x). Программа имеет вид:

program Р26;

varу:real;n:Integer;

function power (k:integer;x:real): real; {описание рекурсив­ной функции} begin

if k=0

then power: = 1 {начальное определение}

else power: = x * power (k - 1, x) {рекурсивное определение}

end; {конец описания функции}

begin {начало главной программы}

write (‘ основание степени х = ‘);

readln(у);

write (‘показатель степени k = ‘);

readln(n);

write (‘х в степени k’, power(n, у)) {вызов функции и печать результата} end. {конец главной программы}

3. Вычисление чисел Фибоначчи. Итальянский математик Фибоначчи придумал последовательность натуральных чисел: 1, 1, 2, 3, 5, 8, 13, ... . Первые два члена последовательности равны единице, а каждый, начиная с третьего, равен сумме двух предыдущих. Для чисел Фибоначчи верно соотношение:

Fk = Fk + Fk-2

Рекурсивная функция получения значения n-го числа Фи­боначчи имеет вид:

functionFib (n:integer): integer;

Begin

ifk<3

then Fib: = 1

else Fib: = Fib (n - 1) + Fib (n - 2)

end;

Для чисел Фибоначчи используется следующее рекурсив­ное определение:

(a)n= 1, n=2: fib(n) = 1

(b) n > 2: fib (n) = fib (n - 2) + fib (n - 1)

Для того чтобы определить fib (6), применяя данное рекур­сивное определение, надо вычислить:

fib (6) = fib(4) + fib(5) = fib(2) + fib(3) + fib (5) = 1 + fib(3) + fib(5) =

= 1 + fib(l) + fib(2) + fib(5) = 1 + 1 + 1 + fib(5) = 3 + fib(3) + fib(4) =

= 3 + fib(l) + fib (2) + fib(4) = 3 + 1 + 1 + fib(4) = 5 + fib(2) + fib(3) =

= 5 + 1 + fib(l) + fib(2) = = 6+1+1=8

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

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

Эта задача связана с легендой о том, что в одном из восточ­ных храмов находится бронзовая плита с тремя алмазными стержнями. На один из них при сотворении мира нанизали 64 диска из чистого золота так, как показано на рисунке 7. Жрецы должны переносить диски с одного стержня на дру­гой, следуя следующим законам:

1) диски можно перемещать только по одному;

2) нельзя класть больший диск на меньший.

Согласно легенде, когда все диски будут перенесены с од­ного стержня на другой, наступит конец света.

Решение этой задачи реализовано в виде рекурсивного ал­горитма, который представляет собой инструкцию по переме­щению дисков. Сформулируем задачу, присвоив имена стерж­ням (А, В, С) и номера дискам (от 1 до n). Надо перенести ди­ски со стержня А на стержень С, используя В как вспомогательный и

Рис. 7. Ханойские башни

следуя приведенным выше правилам переноса дисков.

Алгоритм на естественном языке имеет вид:

1) если n = 0, остановиться;

2) переместить верхние п - 1 дисков со стержня А на стер­жень В, используя стержень С как вспомогательный;

3) переместить оставшийся диск со стержня А на стержень С;

4) переместить п - 1 дисков со стержня В на стержень С, используя стержень А как вспомогательный.

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

program Р27;

vark:integer;

procedure Hanoy (n:integer; One, Two, Three:char);

Begin

if n > 0then

Begin

Hanoy (n - 1, One, Three, Two);

write (‘ переместить диск’, n, ‘со стержня ‘, One, ‘на стержень ‘, Two);

Hanoy (n - 1, Two, One, Three)

end;

end;

Begin

write (‘введите количество дисков’);

readln(k):

Hanoy (k,’А’,’В’,’С’)

End.

Результат работы программы для n = 3 — это инструкция из 7 пунктов (п = 4 — инструкция из 15 пунктов):

переместить диск 1 со стержня А на стержень С

переместить диск 2 со стержня А на стержень В

переместить диск 1 со стержня С на стержень В

переместить диск 3 со стержня А на стержень С

переместить диск 1 со стержня В на стержень А

переместить диск 2 со стержня В на стержень С

переместить диск 1 со стержня А на стержень С

 



<== предыдущая лекция | следующая лекция ==>
Краткие теоретические сведения. | Методические указания по работе и задания


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.735 сек.