Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по TURBO PASCAL.doc
Скачиваний:
18
Добавлен:
04.11.2018
Размер:
1.13 Mб
Скачать
  1. Рекуррентные соотношения

  1. Самостоятельное задание

Найдите закономерность и продолжите следующие последовательности:

  • 2 4 6 8 ...

  • 7 10 13 16 ...

  • 2 4 8 16 ...

  • 1 3 9 27 ...

  • 1 1 2 3 5 8 13 ...

  1. Последовательность Фибоначчи

Последняя последовательность из самостоятельного задания называется последовательностью Фибоначчи. Эта последовательность начинается с двух единиц и каждый последующей её элемент равен сумме двух предыдущих. Поэтому следующий её элемент будет 8+13=21.

Найдем ещё несколько элементов этой последовательности:

1 1 2 3 5 8 13 21 34 55 89 144 233

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

a1 = 1

a2 = 1

ai = ai-2 + ai-1 , где i > 2.

По этой схеме можно найти любой элемент последовательности Фибоначчи, если известны значения предыдущих элементов, например:

a5 = a4 + a3 = 2 + 3 = 5

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

Программа будет такой:

Program Fibonacci;

Var a : array [1..10] of integer;

i : integer;

Begin

a[1] := 1; { Первые два элемента заданы сразу }

a[2] := 1;

For i := 3 to 10 do {Ищем с 3 эл-та, так как первые два уже найдены}

a[i] := a[i-2] + a[i-1];

writeln (’Последовательность Фибоначчи: ’);

For i := 1 to 10 do { Печатаем на экран }

writeln (a[i]);

end.

Итак, уже, думаю, у вас сформировалось вполне конкретное определение рекуррентной последовательности:

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

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

  1. Другие рекуррентные последовательности

Рассмотрим несколько различных задач на закрепление новой темы.

Дана последовательность, которая задана таким рекуррентным соотношением:

a1 = 1

a2 = 1

a3 = 1

an = an–3 + an–2 + an–1 , где n > 3

Найти первые m её членов, m < 100 (вводится с клавиатуры).

Программа, реализующая это задание, будет только немного отличаться от программы поиска чисел Фибоначчи:

Program Rekurrent;

Var a : array [1..99] of integer;

m, i : integer;

Begin

Write (’Введите число m: ’);

Readln (m); { ввод начальных данных }

a[1] := 1; { Первые три элемента заданы сразу }

a[2] := 1;

a[3] := 1;

For i := 4 to m do {Ищем с 4 эл-та, так как первые три знаем }

a[i] := a[i-3] + a[i-2] + a[i-1];

writeln (’Первые m элементов последовательности: ’);

For i := 1 to m do { Печатаем на экран }

write(a[i], ’ ’);{числа будут печататься в строчку через пробел}

writeln; { в конце надо перейти на новую строку }

end.

Теперь рассмотрим другое, немного более сложное задание.

Задана рекуррентная последовательность:

a1 = 3

a2 = 2

a3 = 5

an = an–3 + 2an–1, где n > 3

Вывести на экран все элементы этой последовательности, меньшие числа k, где k вводится с клавиатуры.

Если раньше мы искали вполне конкретное число элементов, то теперь нам нужно будет искать элементы до тех пор, пока один из них не превысит заданное число k (для строгости надо заметить, что это верно лишь для возрастающей последовательности, то есть когда каждый последующий её элемент больше любого предшествующего, а данная последовательность является возрастающей). Для реализации этой задачи в программе придётся отказаться от цикла for и использовать цикл while, в заголовке которого будет проверяться: не превышает ли последний найденный элемент числа k? Вот эта программа:

Program Rekurrent_do_k;

Var a : array [1..99] of integer;

i, j, k : integer;

Begin

Write (Введите число k: ’);

Readln (k); { ввод начальных данных }

a[1] := 3; { Первые три элемента заданы сразу }

a[2] := 2;

a[3] := 5;

i := 3;

while a[i] < k do

begin

i := i + 1; {цикл while сам не увеличивает i }

a[i] := a[i-3] + 2*a[i-1];

end;

writeln(’Элементы последовательности, меньшие ’,k,’:’);

For j := 1 to i-1 do { (i-1) — номер последнего найденного }

write(a[j], ’ ’); { элемента, который меньше k }

writeln;

end.

Попробуйте запустить эту программу и в качестве начального данного ввести число 29590. Правилен ли будет ответ? Прокомментируйте ситуацию!