Предыдущий раздел

Суммирование последовательности

  Задача 1. Вычислить сумму чисел , где n = 1, 2, ..., 10. Мы, конечно, люди грамотные и умеем суммировать геометрическую прогрессию, но давайте заставим эту железяку тупо и терпеливо, как это ей и свойственно, складывать числа. Потом это будет полезно нам для работы с другими последовательностями, не так легко поддающимися суммированию в конечном виде.

Первое решение. Для хранения чисел заведем массив
 

 
Теперь его надо заполнить. Назовем это алгоритмом 1:
 

 
(Здесь также можно было для вычисления применить разработанную ранее функцию Power (см.).

Для суммирования последовательности заведем накопитель s и инициализируем его нулевым значением суммы. И будем прибавлять:
 

Вот и все, осталось только вывести значение s на экран для обозрения.

Вы можете принять файл (a0.pas), чтобы увидеть в работе эти алгоритмы.
Очень полезно также проследить, что еще пришлось добавить к наброску алгоритма, чтобы превратить его в работающую программу.

Первое улучшенное решение. Алгоритм 1 можно значительно улучшить, если заметить, что каждый следующий элемент последовательности можно легко получить из предыдущего по рекуррентной формуле :

 
(Обратите внимание на пределы изменения индекса i!)
Можно принять и эту программу в готовом виде (файл a1.pas).

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

 
И здесь можно получить файл a2.pas с программой.

Третье улучшенное решение получается объединением циклов. Так как алгоритмы 1 и 2 основаны на "одинаковых" циклах FOR i := 1 TO 10, то естественно попытаться объединить эти циклы в один.
 

 
И этот файл (a3.pas) можно получить.

И вот тут мы замечаем, что для изменения накопителя s можно вместо элемента массива x[i] использовать равную ему по значению переменную y. Только, чтобы это равенство действительно было, порядок строк надо чуть изменить:
 
x[i] := y; 
s := s + y;
y := y / 2;

 
А теперь вдруг обнаруживается, что элемены массива
x[i] и вовсе не при чем!

Окончательное решение вы видите справа:
Можете просмотреть и его работу (файл a.pas).

Мораль:
Не все, что в математической формуле изображается переменной с индексом, в программе следует изображать массивом.

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

  Задача 2. Напишите функцию, вычисляющую значение с заданной точностью суммированием отрезка ряда Тейлора подходящей длины.

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

  Задача 3. Квадратный корень из положительного числа а можно получить как предел очень быстро сходящейся последовательности, заданной рекуррентной формулой . Напишите фунцию, вычисляющую с заданной точностью. Начальное значение можно взять, например, равным . В качестве условия остановки цикла возьмите неравенство , где "относительная погрешность" e задана.

Здесь можно просмотреть решение этой задачи.

Следующий раздел