Next:4.3.3
Схема Горнера
Up:4.3
Программы вычисления элемента последовательности
Previous:4.3.1
Вычисление факториала
,
которые превышают заданное число .
Решение. Обозначим через Сумма(K), где K,
сумму
и рассмотрим две последовательности
и , ,, , ,
в которых = и для всех . Поскольку с ростом значение стремится к нулю, для заданного E существует такое минимальное , что и . Таким образом, для решения задачи достаточно построить последовательности X и , в которых является ответом на вопрос задачи. Нетрудно сформулировать следующие свойства этих последовательностей:
(1) ,
(2) ,
(3)
для всех ,
(4)
для всех
(5)
для всех
(6) .
Эти свойства можно использовать как правила построения элементов последовательности по схеме решения, аналогичной схеме из п. 4.3.1 и реализованной в программе Основание.
Как и Факториал, программа Основание состоит из трех частей: вычисление начального состояния памяти (строчка 1), многократное перевычисление состояния памяти в операторе цикла до тех пор, пока не будет получено желаемое конечное состояние памяти (строчки 3-17), и печать результата (строчки 19-20). Однако, в отличие от задачи из п. 4.3.1, здесь количество итераций (число ) заранее не известно и зависит от величины E. Поэтому в программе Основание нельзя использовать оператор цикла с параметром.
Правила 1 и 2 дают строчку 1, правила 3 и 4 в соответствии с методом, использованным в программе Факториал для вычисления факториала K!, приводят к построению цикла (строчки 4-16), а правила 5 и 6 определяют выражение в заголовке цикла.
В процессе выполнения программы переменные X и B последовательно принимают значения X, X, X, и ,, , соответственно, где -- номер итерации цикла.
module Основание;
var X,B,E,F : real; K,M : integer;
begin
(* 1*) read(E); X := 1; B := 1; K :=
1; F := 1;
(* 2*) (*{X=Сумма(K-1), B=1/K!, K=1}*)
(* 3*) while B > E do
(* 4*)
(* {X=Сумма(K-1), B=1/K!>E} *)
(* 5*)
X := X+B; K := K+1;
(* 6*)
F := 1; M := 0;
(* 7*)
(* {X=Сумма(K-1), B=1/(K-1)!, E<1/(K-1)!}*)
(* 8*)
(* {F=M!, M<=K, M=0}*)
(* 9*)
while B# K do
(*10*)
(* {F=M!, M<K, M>=0}*)
(*11*)
M := M+1; F := F*M;
(*12*)
end;
(*13*)
(* {F=M!, M=K, M>=0}*)
(*14*)
(*{X=Сумма(K-1), B=1/K!>E}*)
(*15*)
B := 1/F
(*16*)
(*{X=Сумма(K-1), B=1/K!, E<1/(K-1)!}*)
(*17*) end;
(*18*) (*{X=Сумма(K-1), B=1/K!<=E, E<1/(K-1)!}*)
(*19*) Write ('Основание натуральных логарифмов,',
(*20*)
'найденное с точностью до',E, 'равно',X)
end Основание.
Заметим, что внутренний цикл 9-12 программы Основание можно ликвидировать, поскольку в нем для каждого нового значения повторяются все умножения, выполненные при вычислении K для предыдущего значения . Используя переменную для хранения произведения , можно обойтись только одним циклом (см. программу Основание, которая вычисляет те же последовательности значений в X и B, что и Основание, но уже базируется на следующих соотношениях:
(1) ,
(2)
(3)
(4)
для всех
(5)
для всех
(6)
для всех
(7)
для всех
(8) .
module Основание2;
var X,B,E,F : real; K,M : integer;
begin
(* 1*) read(E); X := 1; B := 1; K :=
1; F := 1;
(* 2*) (*{X=Сумма(K-1), B=1/K!, K=1}*)
(* 3*) while B > E do
(* 4*)
(*{X=Сумма(K-1), B=1/K!>E}*)
(* 5*)
X := X+B; K := K+1;
(* 6*)
F := F
K; B := 1/F
(* 7*)
(*{X=Сумма(K-1), B=1/K!, E<1/(K-1)!}*)
(* 8*) end;
(* 9*) (*{X=Сумма(K-1), B=1/K!<=E,
E<1/(K-1)!}*)
(*10*) Write ('Основание натуральных логарифмов,',
(*11*)
'найденное с точностью до',E, 'равно',X)
end Основание2.
Заметим, что еще более эффективное решение (см. программу ) можно получить путем исключения умножения из тела цикла. Для этого воспользуемся следующими рекуррентными соотношениями:
(1)
(2)
(3)
для всех
(4)
для всех
(5)
для всех K
(6) .
module Основание3
var X,B,E,F : real; K,M : integer;
begin
begin
(* 1*) read(E); X := 1; B := 1; K :=
1; F := 1;
(* 2*) (*{X=Сумма(K-1), B=1/K!, K=1}*)
(* 3*) while B > E do
(* 4*)
(*{X=Сумма(K-1), B=1/K!>E}*)
(* 5*)
X := X+B; K := K+1; B := B/K;
(* 6*)
(*{X=Сумма(K-1), B=1/K!, E<1/(K-1)!}*)
(* 7*) end;
(* 8*) (*{X=Сумма(K-1), B=1/K!<=E,
E<1/(K-1)!}*)
(* 9*) Write ('Основание натуральных
логарифмов,',
(*10*)
'найденное с точностью до',E, 'равно',X)
end Основание3.
Отметим прямую связь программ, реализующих первый и последний варианты.
Несложный анализ программы
позволяет выявить особенности использования в ней переменных
и M. Это промежуточные (рабочие) переменные фрагмента 6-14, необходимые
для вычисления (по значению переменной K) значения ,
присваиваемого переменной В в операторе 15. Этот оператор предназначен
для изменения значений переменных K, X, B и E
в соответствии с переходом от утверждения 14 к утверждению 16, поэтому
мы можем заменить его оператором B := B/K . В результате
такой замены становится ненужным фрагмент 6-14. Его удаление завершает
переход от программы Основание к программе Основание.
Next:4.3.3
Схема Горнера
Up:4.3
Программы вычисления элемента последовательности
Previous:4.3.1
Вычисление факториала