- •§0.1. Базовые знания
- •§0.2. Где достать интерпретатор языка Питон?
- •§0.3. Установка интерпретатора языка Питон в unix
- •§0.3.1. Установка/обновление Питона из грт-пакета
- •§0.3.2. Установка Питона из исходного кода
- •§0.4. Установка Питона в ос Windows
- •§0.5. Запуск программ, написанных на Питоне
- •§0.6. Среда разработки
- •§1.1. Алгоритмы и программы
- •§1.2. Языки программирования и уровни абстракции
- •Глава 1. Базовые понятия
- •§1.3. Формальные и естественные языки
- •§1.4. Интерпретаторы и компиляторы
- •§1.5. Первая программа
- •§1.6. Что такое отладка?
- •§1.6.1. Синтаксические ошибки (syntax errors)
- •§1.6.2. Ошибки выполнения (runtime errors)
- •§1.6.3. Семантические ошибки (semantic errors)
- •§1.6.4. Процесс отладки
- •Глава 2. Переменные, операции и выражения
- •§2.1. Значения и типы
- •§2.2. Преобразование типов
- •§2.3. Переменные
- •§2.4. Имена переменных и ключевые слова
- •§2.5. Выражения
- •§2.6. Выполнение выражений
- •§2.7. Операторы и операнды
- •§2.8. Порядок операций
- •§2.9. Простейшие операции над строками
- •§2.10. Композиция
- •Глава 3. Функции §3.1. Подпрограммы
- •§3.2. Вызовы функций
- •§3.3. Справочная система
- •§3.4. Импорт модулей и математические функции
- •§3.5. Композиция
- •§3.6. Создание функций
- •§3.7. Параметры и аргументы
- •§3.8. Локальные переменные
- •§3.9. Поток выполнения
- •§3.10. Стековые диаграммы
- •§3.11. Функции, возвращающие результат
- •Глава 4. Компьютерная графика
- •Глава 5. Логические выражения, условия и рекурсия §5.1. Комментарии в программах
- •§5.2. Простые логические выражения и логический тип данных
- •§5.3. Логические операторы
- •§5.4. Выполнение по условию и «пустота»
- •§5.5. Ввод данных с клавиатуры
- •§5.6. Альтернативные ветки программы (Chained conditionals)
- •§5.7. Пустые блоки
- •§5.8. Вложенные условные операторы (Nested conditionals)
- •§5.9. Рекурсия
- •§5.10. Стековые диаграммы рекурсивных вызовов
- •§5.11. Максимальная глубина рекурсии
- •§5.12. Числа Фибоначчи
- •Глава 6. Циклы
- •§6.1. Оператор цикла while
- •§6.2. Счетчики
- •§6.3. Бесконечные циклы
- •§6.4. Альтернативная ветка цикла while
- •§6.5. Табулирование функций
- •§6.6. Специальные и экранируемые символы
- •§6.7. Числа Фибоначчи и оператор цикла while
- •§6.8. Вложенные операторы цикла и двумерные таблицы
- •§6.9. Классификация операторов цикла
- •§6.10. Управляющие структуры
- •Глава 7. Строки
- •§7.1. Оператор индексирования
- •§7.2. Длина строки и отрицательные индексы
- •§7.3. Перебор и цикл for
- •§7.4. Срезы строк
- •§7.5. Сравнение строк
- •§7.6. Строки нельзя изменить
- •§7.7. Функция find
- •§7.8. Циклы и счётчики
- •§7.9. Модуль string
- •§7.10. Классификация символов
- •§10.2. Операции над словарями
- •§10.3. Методы словарей
- •§10.4. Использование псевдонимов и копирование
- •§10.5. Разряженные матрицы
- •§10.6. Подсказки
- •§10.7. Тип «длинное целое число»
- •§10.8. Подсчет букв
§5.11. Максимальная глубина рекурсии
Мы уже сталкивались с бесконечной рекурсией, когда рекурсивная функция по тем или иным причинам не достигала условия возврата (в англоязычной литературе base case -«базовый случай»). Но в большинстве программных сред такие программы, конечно же, бесконечно выполняться не будут в силу конечного размера памяти компьютера. В Питоне для предотвращения нарушений работы компьютера, на котором выполняется программа, тоже имеется специальное ограничение - maximum recursion depth {максимальная глубина рекурсии).
Максимальную глубину рекурсии можно изменять, т.к. некоторые задачи требуют большего максимального размера стека вызовов. Для этого в модуле sys имеется две функции: sys .getrecursionlimit (), возвращающая текущую максимальную глубину рекурсии и sys . setrecursionlimit (), изменяющая ее значение.
>» |
import sys |
|
|
>» |
sys |
.getrecursionl |
imit() |
юос |
|
|
|
>» |
sys |
.setrecursionl |
imit(5) |
>» |
sys |
.getrecursionl |
imit() |
5 |
|
|
|
>» |
|
|
|
По умолчанию, максимальная глубина рекурсии равна 1000.
Упражнение. Напишите простую функцию, вызывающую саму себя, и поэкспериментируйте с изменением максимальной глубины рекурсии. Прокомментируйте свои результаты.
§5.12. Числа Фибоначчи
Леонардо Фибоначчи (Леонардо Пизанский) - крупный средневековый итальянский математик (1170-1240), автор «Книги об абаке» (1202), которая несколько веков оставалась основным сборником сведений об арифметике и алгебре. Сегодня имя Фибоначчи чаще всего упоминается в связи с числовой последовательностью, которую он обнаружил, изучая закономерности живой природы.
Ряд этих чисел образуется следующими значениями 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 и так далее - каждое последующее число ряда получается сложением двух предыдущих.
Особенностью ряда чисел Фибоначчи является то, что по мере роста номера числа в последовательности, отношение предшествующего члена к последующему приближается к значению - 0.618 (древние греки называли это число «золотым сечением»), а последующего к предыдущему- к 1.618. «Золотым» это соотношение называют из-за того, что на нем же основан принцип музыкальной, цветовой и геометрической гармонии.
[NOTE: Про числа Фибоначчи можно много интересного написать, но я оставил это на потом.]
Давайте напишем функцию, рассчитывающую n-й элемент ряда Фибоначчи. Итак, мы
имеем обобщенную формулу: /i=/2 = l> fn = fn-i~^~fn-2> we'N . Можем ли мы применить
здесь рекурсию?
62
Ревизия: 170
Логические выражения, условия и рекурсия
Каждое число Фибоначчи представляет собой сумму двух предыдущих чисел Фибоначчи, которые расчитываются по той же формуле, все числа Фибоначчи целые и положительные, кроме того, мы имеем граничное значение. Так что применить рекурсию в данном случае вполне можно.
>» def fibonacci (n) : |
|
... if n == 1 or n == 2: |
|
... return 1 |
|
... return fibonacci(n-1) |
+ fibonacci(n-2) |
>» fibonacci (5) |
|
13 |
|
Замечательно. Теперь осталось добавить проверку типа и положительности параметра функции и готово.
def fibonacci(n): |
|
|
|
if type(n) != type(l) |
or n < 0: |
# Проверка |
корректности n |
return None |
|
|
|
if n == 1 or n == 2: |
|
|
|
return 1 |
|
|
|
return fibonacci(n-1) |
+ fibonacci |
(n-2) |
|
Упражнение. Создайте рекурсивную функцию, возвращающую сумму 2^ *' п
63
Ревизия: 170
Циклы
