Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по программированию..pdf
Скачиваний:
10
Добавлен:
15.11.2022
Размер:
12.2 Mб
Скачать

8.1.Что такое рекуррентная последовательность

Из курса математики известно понятие рекуррентной последова­ тельности. Это понятие вводится так: пусть известно к чисел: ai, .. ak. Эти числа являются началом числовой последовательности. Следу­ ющие элементы этой последовательности вычисляются так:

ak+i = F(au ..., a*); aM = ^(a2>•••>ak+i)i

аш = -^(a3? ••■>ам)

Здесь JF(. ..) — функция от к аргументов. Формула вида

а,- = F

cij—2? •••

it)

называется рекуррентной формулой. Величина к называется глубиной рекурсии.

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

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

CL\ = 1, fl2 = 3, Аз = 5, 04 = 7, 05 = 9,.. *

о ,\ = 1,й2 = 2, Лз = 4, Л4= 8,05 = 16,.. *

Рекуррентная формула для первого ряда чисел сл^ДУ1011*3^

а»—Oj-l + 2.

Рекуррентная формула данной геометрической прогрессии:

Q'j ■“*2 *

Глубина рекурсии в обоих случаях равна единш*е (такую зависи­ мость еще называют одношаговой рекурсией). В цеД0М рекуррентная последовательность описывается совокупностью на<*альных значений и рекуррентной фюрмулы. Все это можно объединил* в °ДНУ ветвящу­ юся формулу. Для арифметической прогрессии:

если i = 1, * {a ,-i + 2, если г > 1.

Для геометрической прогрессии:

если г = 1, если г > 1.

Следующая числовая последовательность известна в математике под названием “числа Фибоначчи” :

1,1,2,3,5,8,13,21,34,55,...

Попробуйте увидеть закономерность!

Нетрудно понять, что, начиная с третьего элемента, каждое число равно сумме значений двух предыдущих, т.е. это рекуррентная после­ довательность с глубиной, равной 2 (двухшаговая рекурсия). Опишем ее в ветвящейся форме:

- _

Г1,

если г = 1, г = 2,

l / i - i + / i - 2,

если г >2.

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

До = l,aj = 1!,а2 = 2!, аз = 3!,а4 = 4!,...

Рекуррентное описание такой последовательности:

Г1, если г = О, а,- = < .

1 а , е с л и г > 0.

8.2. Программирование вычислений рекуррентных последовательностей

С рекуррентными последовательностями связаны задачи такого рода:

1)вычислить заданный (n-й) элемент последовательности;

2)математически обработать определенную часть последовательно­ сти (например, вычислить сумму или произведение первых п членов);

3)подсчитать количество элементов на заданном отрезке последо­ вательности, удовлетворяющих определенным свойствам;

4)определить номер первого элемента, удовлетворяющего опреде­

ленному требованию;

5) вычислить и сохранить в памяти заданное количество элементов последоват ельности.

Данный перечень задач не претендует на полноту, но наиболее ча­ сто встречающиеся типы он.охватывает.

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

П ример 1. Вычислить n-й элемент описанной выше арифметиче­ ской прогрессии.

Var N, I O..MaxInt; -Cexampl3.pas}

A Real;

Begin

WriteON = ’);

ReadLn(N);

A := 1;

For I :B 2 To N Do

A := A ♦ 2;

WriteLnOAO, N 1. 0 =\ A 6 0)

End.

Рекуррентная формула a, == a,*_i4-2 перешла в оператор A := A + 2. П ример 2. Просуммировать первые п элементов описанной выше геометрической прогрессии (не пользуясь формулой для суммы про­

грессии).

Var N,

I

0 ..Maxlnt;

A,

S

Real;

Begin

 

 

WriteON = ’ ); ReadLn(N);

A

:=

1

 

S

:= A

= 2 To N Do

For I

 

Begin

 

 

A

:*

2 * A;

 

S

S + A

End;

WriteLnOСукна равна *, S 6 0)

End.

При вычислении рекуррентной последовательности с глубиной 2 уже нельзя обойтись одной переменной. Это видно из следующего при­ мера.

П ример 3. Вывести на печать первые п (п > 3) чисел Фибоначчи. Подсчитать, сколько среди них четных чисел.

Var N,

I, K, F, FI, F2 O..MaxInt;

Begin

 

FI :* 1;

F2

1;

К0;

WriteLnC’FCl)- \

FI,

* F<2)=

F2);

For I

:■ 3 To N Do

 

 

 

Begin

FI + F2;

 

 

 

 

F

I

1,

')* », F);

WriteLnC’FO,

If Not Odd(F) Then К

:« К ♦ 1;

FI

:= F2;

 

 

 

 

F2

:= F

 

 

 

 

End;

 

 

 

 

 

WriteLnC 'Количество четных чисел в последовательности равно *» К) End.

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

Пример 4. Для заданного вещественного х и малой величины е (например, е = 0,000001) вычислить сумму ряда

г2

тз

1 + Х+ "2Г +

ЗТ + *’ **

включив в нее только слагаемые, превышающие е.

Из математики известно, что сумма такого бесконечного ряда имеет конечное значение, равное ех, где е = 2,71828... — основание на­ турального логарифма. Поскольку элементы этого ряда представляют собой убывающую последовательность чисел, стремящуюся к нулю, то суммирование нужно производить до первого слагаемого, по абсолют­ ной величине не превышающего е.

Если слагаемые в этом выражении обозначить следующим образом:

ао = 1? а\=

/р2

хг

а 22р а3 ~ др

то обобщенная формула для г-го элемента будет следующей:

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

что рекурсия — одношаховая, и что каждый следующий элемент полу­ чается путем умножения предыдущего на некоторый множитель, т.е.

а,- = К •а,_1.

Используя обобщенную формулу, имеем:

 

 

х{

= К -

®«-1

 

 

г\

 

(г -1 )!'

 

Отсюда:

 

 

_ х

 

К =

ж,-/г!

 

 

 

 

 

Действительно:

 

 

 

 

X

^2 =

X

X

' 2 И т.д.

а0 = 1, а 1 = а0 •р

а1 •2"5

а3 = а2

Следовательно, данная рекуррентная последовательность опишется так:

1,

если г = О,

{di-i j ,

если г > 0.

И наконец, программа, решающая поставленную задачу.

Var А, X, S, Eps Real;

I Integer;

Begin

WriteC’X = >); ReadLn(X);

WriteC’Epsilon = *);

ReadLn(Eps);

A := 1;

S := 0;

I := 0;

While AbsCA) > Eps Do

Begin

S := S + A;

I := I + 1;

A := A + X / I

End;

WriteLnC*Сумма рада равна *, S 10 4)

End.

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

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

процессом. Соответственно циклы, реализующие итерационный вы­ числительный процесс, называются итерационными циклами. Для их организации используются операторы while или repeat-

Пример 5. Для заданного натурального N и вещественного х (х > 0) вычислить значение выражения:

\[x + yJx + ..~. + y/x.

N корней

Здесь уже рекуррентность не столь очевидна. Попробуем найти ее методом индукции. Будем считать, что искомое выражение есть N-й элемент последовательности следующего вида:

ai = у/х, а 2= y/x + у/х, а 3= ][х + у/зГ±^,

Отсюда видна связь:

0>2 = у/х + ai, a3 = yjx -f"

CLi — yjx + Oi^l

Теперь поставленная задача решается очень просто:

Var А, X

Real;

 

 

I, N

Integer;

Begin

 

ReadLn(X);

WriteOX ■ О;

WriteC’N - 0 ; ReadLn(N);

A

:= Sqrt(X);

 

I

1;

 

 

For I :» 2 To N Do

 

A := SqrtCX + A);

WriteLn(*Ответ:

A)

End.

 

 

 

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

__ Гао,

если г = 1,

* ~~ \а,_! + dy

если г > 1.

Соответствующая подпрограмма-функция: