Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Понятие рекурсии




Рекурсия – это такой способ организации вычислительного процесса, при котором подпрограмма в ходе выполнения обращается сама к себе. При выполнении правильно организованной рекурсивной программы осуществляется многократный переход от некоторого текущего уровня алгоритма к нижнему уровню последовательно до тех пор, пока не будет получено тривиальное решение поставленной задачи – база рекурсии. Затем осуществляется возврат на верхний уровень. В самом общем виде рекурсивная организация вычислительного процесса состоит из действий на входе в рекурсию, проверки условия завершения вхождения в рекурсию и действий на выходе из рекурсии. В правильно организованной рекурсии обязательно должно быть условие завершения процесса вхождения в рекурсию. Для реализации выхода из рекурсии требуется хранить точки возврата. Место для хранения точек возврата называется «стеком вызовов» и для него системой программирования выделяется определённая область оперативной памяти. В этом стеке запоминаются не только адреса точек возврата, но и значения всех локальных переменных. Образно выражаясь, запоминается «слепок» процедуры или функции.

С помощью рекурсии удобно представлять те задачи, которые сводятся к подзадачам того же типа, но меньшей размерности. Например: n! = n×(n-1)!. Здесь задача о вычислении n! может быть решена, если решена задача о вычислении (n-1)! и так далее.

Задача 20. Рассмотрим использование рекурсии при написании программы по вычислению n! Значение n (n £ 20) возьмём из текстового файла, туда же запишем результат вычисления.

function fact(k : integer): int64;

begin

if k=1 then fact:=1

else fact:= k * fact(k-1)

end;

procedure TForm1.Button1Click(Sender: TObject);

var n : integer; f:textfile;

begin

assignfile(f, ' n.txt'); reset(f);

readln(f, n);

append(f);

writeln(f, ' n! = ' , fact(n));

closefile(f);

memo1.Lines.LoadFromFile(' n.txt ');

end;

Проследим выполнение этой программы в пошаговом режиме. Предположим, n равно 4. После вызова функции fact формальный параметр k получает значение 4. При выполнении функции сначала проверяется условие k=1. Так как оно не выполнено, то управление передаётся оператору присваивания fact:=k * fact(k–1), при выполнении которого происходит вызов функции fact, но уже для значения k на единицу меньше. Снова происходит проверка условия k=1 и, так как оно опять не выполнено, то снова вызывается fact для значения k на единицу меньше. При достижения условия завершения входа в рекурсию (k=1) получим fact:=1, после чего происходит выход из рекурсии:

k=2 fact:= k * fact(k–1) = 2*1 = 2

k=3 fact:= k * fact(k–1)= 3*2 = 6

k=4 fact:= k * fact(k–1)= 4*6 = 24

Задача 21. Описать рекурсивную функцию для подсчёта количества запятых в данном текстовом файле.

Файловая переменная f должна быть описана в интерфейсной части модуля.

function kol:integer;

var d:char;

begin

read(f, d);

if d=#26 then kol:=0

else if d=' , ' then kol:=kol + 1 else kol:=kol

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

memo1.Lines.LoadFromFile(' w.txt ');

assignfile(f,' w.txt '); reset(f);

label1.Caption:=' Ответ ' + inttostr(kol);

closefile(f)

end;

 

Задачи

Задача 22. Описать рекурсивную функцию

function step(z : real; m:byte):real;

для вычисления zm (z – вещественное, m – натуральное) и с её помощью подсчитать значение выражения a7 + b8 .

Задача 23. Описать рекурсивную функцию

function fib(n : integer) : integer;

для вычисления n-ого (n £ 40) числа Фибоначчи.

Указание. Последовательность чисел Фибоначчи fk образуется так:

f0=1, f1=1, fk = fk-2 + fk-1.

Задача 24. Описать рекурсивную функцию

function arifm(a, d, k : integer) : integer;

для вычисления k-ого элемента арифметической прогрессии (a – первый элемент прогрессии, d – разность прогрессии).

 


Поделиться:

Дата добавления: 2015-09-15; просмотров: 110; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты