- •ПРЕДИСЛОВИЕ
- •1.1. История и классификация языков программирования высокого уровня
- •1.2. Первое (знакомство с Паскалем
- •Задания
- •Лекция 2
- •2.1. Некоторые сведения о системе ТУрбо-Паскаль
- •2.2. Способы описания языка программирования
- •Лекция 3
- •3.2. Типы данных
- •4.1. Структура Паскаль-программы
- •4.2. Арифметические операции, функции, выражения Арифметический оператор присваивания
- •Форматы процедуры write
- •Задания
- •1. Что будет напечатано программой
- •если последовательно вводятся три числа: 36, -6, 2345?
- •5.2. Функции, связывающие различные типы данных
- •Задания
- •Теперь посмотрим, как это программируется наТЛаскале.
- •Здесь
- •<параметр цикла>::= <имя простой переменной порядкового типа>
- •Задания
- •7.1. Подпрограммы-процедуры
- •7.2. Подпрограммы-функции
- •7.4. Рекурсивные подпрограммы
- •8.1. Что такое рекуррентная последовательность
- •8.2. Программирование вычислений рекуррентных последовательностей
- •Задания
- •Задания
- •6. Вывод результата.
- •Теперь будем составлять подпрограммы.
- •Задания
- •12.2. Операции над множествами
- •12.3. Примеры использования множеств
- •Красивая программа! К сожалению, ею нельзя воспользоваться для
- •В этой программе использована функция определений размера файла:
- •.Fiiesize(<HMH файловой переменной>);
- •Задания
- •14.2. Работа с файлами записей
- •Задания
- •15.2. Связанные списки
- •Лекция 16
- •16.1. Организация внешних подпрограмм
- •16,2. Создание и использование модулей
- •распечаткой текста программы с подробными комментариями.
- •выполнения следующих операции над обыкновенными дробями вида -q
- •(Р — целое, Q — натуральное):
- •1) сложение;
- •2) вычитание;
- •3) умножение;
- •4) деление;
- •5) сокращение дроби;
- •7) функции, реализующие операции отношения (равно, не равно,
- •Используя этот модуль, решить задачи:
- •При разработке модуля рекомендуется такая последовательность
- •Задания
- •Приведем текст программы целиком.
- •ЗАДАНИЯ ПО ТЕМЕ “ЛИНЕЙНЫЕ АЛГОРИТМЫ”
- •ЦЕЛОЧИСЛЕННАЯ АРИФМЕТИКА
- •Сортировка массивов
- •ЗАДАЧИ ПО ТЕМЕ “ОБРАБОТКА СТРОК”
- •ЗАДАНИЯ ПО ТЕМЕ “МОДУЛИ”
- •ЗАДАНИЯ ПО ТЕМЕ “ДИНАМИЧЕСКИЕ ПЕРЕМЕННЫЕ”
- •Задачи, предлагавшиеся на школьных олимпиадах по программированию (Пермская область)
- •Учебное издание
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 |
хг |
а 2— 2р а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. |
Соответствующая подпрограмма-функция: