Отправляет email-рассылки с помощью сервиса Sendsay

Всё о работе в Интернет

  Все выпуски  

Занятие 42.


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

Очень важно усвоить основные приёмы, с помощью которых тот или иной вычислительный процесс можно представить в виде цикла. Собственно, это и гарантирует компактную запись соответствующего алгоритма. Естественно, нужно начинать с простейших случаев.  

АЛГОРИТМ ВЫЧИСЛЕНИЯ СУММЫ И ПРОИЗВЕДЕНИЯ ЧЛЕНОВ ПОСЛЕДОВАТЕЛЬНОСТИ ПРОСТОГО ТИПА

Последовательностью простого типа будем называть такую, в которой значение каждого члена связано некоторой функциональной зависимостью только с его порядковым номером. Такую функциональную зависимость принято называть общим членом числовой последовательности. При этом предполагается, что использованная функциональная зависимость не имеет разрывов в том смысле, который рассматривался нами при обсуждении алгоритма решения задачи V.1.2 (см. материалы занятия 23).  

Примером формулы общего члена числовой последовательности простого типа может быть формула Ai = 1 / ( 2 + sin(i) ), i = 1, 2, 3, … .

Это значит, что члены числовой последовательности A1, A2, A3, ... должны вычисляться по следующим формулам: A1 = 1 / ( 2 + sin(1) ), A2 = 1 / ( 2 + sin(2) ), A3 = 1 / ( 2 + sin(3) ) и т.д.

Обратим внимание, что любой член последовательности Ai может быть вычислен при любом значении порядкового номера i.

Решим следующую задачу.

Задача C.1.1. “Сумма членов последовательности простого типа”. Бесконечная числовая последовательность простого типа задана формулой общего члена i = f ( i ), = 1, 2, 3, ... . Построить алгоритм вычисления суммы первых N членов этой последовательности (>= 0).

Предлагается следующий вариант записи такого алгоритма.

алг СуммаППТ ( N: нат ): вещ
нач
i: нат, S: вещ
   
:= 0
   для
i от 1 до N
   выполнять
:= S + f ( i )
   СуммаППТ :=
 S
кон

В алгоритме C.1.1 СуммаППТ (Сумма членов Последовательности Простого Типа) используется обращение к некоторой функции ( i ) с целью вычисления значения члена последовательности по его порядковому номеру. Для нашего примера такая функция может иметь следующий вид:

алг f ( i : нат ): вещ
нач
   f := 1 / ( 2 + Sin ( i ) )
кон

Смысл команд алгоритма СуммаППТ мы практически полностью уже обсудили на предыдущем занятии.

Для выполнения суммирования использовано рекуррентное соотношение := S + f ( i ) в составе команды повторения с параметром. При этом переменная S инициализирована нулевым значением непосредственно перед циклом. Заметим, что нулевое начальное значение для суммы является общепринятым типичным алгоритмическим решением, и ему следует отдавать предпочтение при построении любых алгоритмов суммирования.

Для вычисления суммы N членов последовательности необходимо выполнить N сложений. Поэтому таким же должно быть и количество повторений серии цикла. Это достигается изменением значений параметра цикла в пределах от 1 до N включительно. При этом параметр цикла i одновременно выполняет роль порядкового номера члена последовательности. Обратите внимание: необходимое количество повторений известно заранее. Следовательно, мы имеем дело с арифметическим циклом, что и даёт нам возможность использовать удобную команду повторения с параметром.

Алгоритм СуммаППТ работает правильно при всех допустимых значениях аргумента >= 0. В частности, при = 1 значением суммы есть значение первого члена последовательности. При = 0 получаем и нулевое значение суммы. Цикл в этом случае не выполняется ни разу, поэтому значение результата определяется инициализированным значением = 0.

Нулевой результат суммирования считается нормальным, хотя в этом случае имеет место скрытая неоднозначность. Дело в том, что равный нулю результат суммирования совсем не означает, что суммирование не выполнялось. Могут быть такие последовательности, сумма членов которых равна нулю и при ¹ 0. Например, для последовательности, заданной формулой общего члена i = i – 2, = 1, 2, 3, ..., равна нулю сумма первых трёх членов.

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

Совершенно аналогично может быть построен и алгоритм вычисления произведения первых N членов такой же последовательности. Необходимые изменения таковы:

-       сменить название алгоритма; при желании можно также взять другую переменную для обозначения результата вычисления произведения;

-       начальное значение для произведения должно быть взято равным 1; запомним, что единичное начальное значение для произведения является общепринятым типичным алгоритмическим решением;

-       операцию сложения следует заменить операцией умножения.

Таким образом, алгоритм C.1.2 вычисления произведения N членов последовательности простого типа приобретает следующий вид.

алг ПроизвППТ ( N: нат ): вещ
нач
i: нат, P: вещ
   
:= 1
   для
i от 1 до N
   выполнять
:= P * f ( i )
   ПроизвППТ :=
 P
кон

Допустимыми значениями аргумента для алгоритма C.1.2 ПроизвПП являются значения >= 0. В частности, при = 1 значением произведения есть значение первого члена последовательности. При = 0 получаем значение произведения, равное единице. Цикл в этом случае не выполняется ни разу, поэтому значение результата определяется инициализированным значением = 1.

Единичное значение произведения считается нормальным, хотя и в этом случае имеет место упоминавшаяся скрытая неоднозначность. Результат, равный единице, не обязательно означает, что умножения не выполнялись. Такой же результат можно получить и при выполнении умножений! Сообразите, например, сколько членов последовательности i = 2- 2, = 1, 2, 3, ..., надо перемножить, чтобы получить в результате единицу. Напомним, однако, что и в этом случае указанная неоднозначность не актуальна, так как количество перемножаемых членов последовательности нам известно.

Уважаемые подписчики! Теперь я должен указать на весьма существенный недостаток того, что мы с вами только что изучили. Оба алгоритма могут работать только с общими членами, обозначенными f(i). В случае одновременного использования разных числовых последовательностей с общими членами, обозначенными, естественно, по-разному, придётся тиражировать аналогичные алгоритмы. А это, увы, не рационально. Хотелось бы, всё-таки, добиться того, чтобы один и тот же алгоритм можно было использовать для разных числовых последовательностей. Для этого нам нужно будет более детально изучить механизм применения подпрограмм в языке Паскаль, чем мы с вами и займёмся на следующем занятии.

Уважаемые подписчики! При необходимости задать вопрос, проконсультироваться, уточнить или обсудить что-либо обращайтесь через Гостевую книгу моего персонального сайта http://a-morgun.narod.ru. При этом настоятельно рекомендую пользоваться браузером Internet Explorer.

С уважением, Александр.


В избранное