Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Чаплыгин А.Н. Учимся програмировать вместе с Пи...doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
3 Мб
Скачать
☆

§6.7. Числа Фибоначчи и оператор цикла while

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

В предыдущей главе мы написали программу, вычисляющую числа Фибоначчи с помощью рекурсивной функции, но она имела ограничение, связанное с максимальной глубиной рекурсии. Это существенный недостаток (хотя решение, бесспорно, красивое).

Но теперь мы знаем о циклах и разберем еще один способ решения задачи нахождения

чисел Фибоначчи. Итак, мы имеем следующую формулу: J\— J\ — 1, /n—/„_i + /„_2> we'N .

В ней используется три переменные. Обозначим их так: f n - результирующее значение функции, f nl и f п2 - промежуточные значения функции используемые в формуле. Знак минуса мы не можем использовать в названиях переменных, помните? Определившись с обозначениями перейдем к анализу задачи.

На первых двух шагах значение функции равно 1. Для расчета последующих чисел из ряда Фибоначчи применим оператор цикла while. На каждом шаге цикла будем вычислять значение fn = fnl + fn2, а затем изменять значения в переменных fnl и fn2, подготавливая их для следующего шага цикла: на следующей итерации f п2 будет равняться fnl, a fnl- fn. Разумеется, для контроля количества итераций цикла мы будем использовать переменную-счетчик i. Вот, что у нас должно получиться:

def fibonacciWithWh

ileLoop(n):

"""Функция вычисления чисел

Фибоначчи

с использованием

оператора цикла

while."""

fn = fnl = fn2

= 1

i = 3

while i <= n:

fn = fnl +

fn2

fn2 = fnl

fnl = fn

i += 1

return fn

72

Ревизия: 170

Циклы

Упражнение. Проанализируйте процесс выполнения данной функции. Правильно ли она работает? Изменяется ли размер стека вызовов при работе данной функции? Что произойдет, если функции fibonacciWithWhileLoop () передать в качестве параметра число 2.4? Доработайте программу так, чтобы этот случай корректно обрабат ывался.

Выполнили задание? Если лень заниматься этим сейчас, то лучше отложить книгу и пойти прогуляться. В лени и усталости нет ничего плохого - это вполне естественно для человека, и глупо это отрицать. Но «халтурить» не стоит. Как говорится, тяжело в учении, легко в бою.

Если с заданием справились, идем дальше.