ВУЗ:
Составители:
Рубрика:
112
u
5
=u
4
+u
3
=2+3=5;
u
6
=u
5
+u
4
=3+5=8 и т.д.
Отсюда следует, что для получения очередного числа достаточно хранить два
предыдущих. Таким образом, в программе постоянно используются три соседних
числа Фибоначчи. Для их хранения достаточно ввести три переменные: А хранит
u
k
, B хранит u
k-1
, C хранит u
k-2
. Для вычисления следующего числа Фибоначчи
необходимо провести сдвиг, т.е. переписать содержимое B в C, а содержимое A в
B. Исходя из этого, получаем фрагмент 28.
{ фрагмент 28 }
c:=1; { значение первого числа известно }
b:=1; { значение второго числа тоже известно }
k:=3; { начинаем вычисление с третьего числа }
while k<=n do { цикл, пока не найдено n-е число }
begin a:=b+c;{вычисляем следующее число как сумму
двух предыдущих }
c:=b; { сдвигаем b в c для нахождения следующего числа }
b:=a; { сдвигаем a в b для нахождения следующего числа }
k:=k+1 { увеличиваем счетчик найденных чисел }
end;
write(a); { печатаем найденное число }
Упражнения:
1. Выполните трассировку фрагмента 28 для n=2,3,4.
2. Дополните фрагмент 28 так, чтобы он правильно выдавал числа Фибоначчи
для любого n>=1.
Пример 10.32. Пусть необходимо разработать фрагмент программы для
вычисления n-го члена последовательности, заданной формулой примера 10.26.
Решение. Первые элементы этой последовательности будут иметь вид: u
1
=1;
u
2
=2; u
3
=u
2
=1; u
4
=u
2
=2; u
5
=u
3
=1 и т.д. Хотя в формуле используется два члена,
хранить нужно три соседних члена, поэтому используем следующие переменные:
А хранит u
k
, B хранит u
k-1
, C хранит u
k-2
. Программа представлена в фрагменте 29.
{ фрагмент 29 }
c:=1;
b:=2;
k:=3;
while k<=n do
begin a:=c;
c:=b;
b:=a;
k:=k+1
end;
write(a);
Упражнение. Решает ли фрагмент 29а ту же задачу, что и фрагмент 29?
Почему?
{ фрагмент 29а }
if n mod 2 =0
then a:=2
else a:=1;
112
u5=u4+u3=2+3=5;
u6=u5+u4=3+5=8 и т.д.
Отсюда следует, что для получения очередного числа достаточно хранить два
предыдущих. Таким образом, в программе постоянно используются три соседних
числа Фибоначчи. Для их хранения достаточно ввести три переменные: А хранит
uk, B хранит uk-1, C хранит uk-2. Для вычисления следующего числа Фибоначчи
необходимо провести сдвиг, т.е. переписать содержимое B в C, а содержимое A в
B. Исходя из этого, получаем фрагмент 28.
{ фрагмент 28 }
c:=1; { значение первого числа известно }
b:=1; { значение второго числа тоже известно }
k:=3; { начинаем вычисление с третьего числа }
while k<=n do { цикл, пока не найдено n-е число }
begin a:=b+c;{вычисляем следующее число как сумму двух предыдущих }
c:=b; { сдвигаем b в c для нахождения следующего числа }
b:=a; { сдвигаем a в b для нахождения следующего числа }
k:=k+1 { увеличиваем счетчик найденных чисел }
end;
write(a); { печатаем найденное число }
Упражнения:
1. Выполните трассировку фрагмента 28 для n=2,3,4.
2. Дополните фрагмент 28 так, чтобы он правильно выдавал числа Фибоначчи
для любого n>=1.
Пример 10.32. Пусть необходимо разработать фрагмент программы для
вычисления n-го члена последовательности, заданной формулой примера 10.26.
Решение. Первые элементы этой последовательности будут иметь вид: u1=1;
u2=2; u3=u2=1; u4=u2=2; u5=u3=1 и т.д. Хотя в формуле используется два члена,
хранить нужно три соседних члена, поэтому используем следующие переменные:
А хранит uk, B хранит uk-1, C хранит uk-2. Программа представлена в фрагменте 29.
{ фрагмент 29 }
c:=1;
b:=2;
k:=3;
while k<=n do
begin a:=c;
c:=b;
b:=a;
k:=k+1
end;
write(a);
Упражнение. Решает ли фрагмент 29а ту же задачу, что и фрагмент 29?
Почему?
{ фрагмент 29а }
if n mod 2 =0
then a:=2
else a:=1;
Страницы
- « первая
- ‹ предыдущая
- …
- 108
- 109
- 110
- 111
- 112
- …
- следующая ›
- последняя »
