Основы программирования на C++, PASCAL

Навигация

ГЛАВА 1. ОСНОВЫ АЛГОРИТМИЗАЦИИ

ГЛАВА 2. ВВЕДЕНИЕ В ЯЗЫКИ ПРОГРАММИРОВАНИЯ

ГЛАВА 3. ПРОГРАММИРОВАНИЕ НА ПАСКАЛЕ

ГЛАВА 4. ЯЗЫК ПРОГРАММИРОВАНИЯ СИ++

ГЛАВА 5. МЕТОДЫ ПОСТРОЕНИЯ АЛГОРИТМОВ

ГЛАВА 6. ЗАДАЧИ ПО ПРОГРАММИРОВАНИЮ

ПРИЛОЖЕНИЯ

СПИСОК ЛИТЕРАТУРЫ

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


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


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


Отсюда:


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


Следовательно, данная рекуррентная последовательность может быть описана следующим образом:


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

Var A,X,S,Eps: Real;

I: Integer;

Begin

Write('X ='); ReadLn(X);

Write('Epsilon ='); ReadLn(Eps);

A:=l; S:=0; I:=0;

While Abs(A)>Eps Do

Begin

S:=S+A;

I:=I+1;

A:=A*X/I

End;

WriteLn('Сумма ряда равна', S:10:4)

End.

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

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

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


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


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


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

Var A,X: Real; I,N: Integer;

Begin

Write('X='); ReadLn(X);

Write('N='); ReadLn(N);

A:= Sqrt(X);

For I:=2 To N Do

A:=Sqrt(X+A);

WriteLn('Ответ:',А)

End.

К решению всех перечисленных выше задач можно подойти иначе.

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

Сделаем это для общего случая, определив арифметическую прогрессию с первым членом а0 и разностью d:


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

Function Progres(АО,D: Real;I: Integer): Real;