Фибоначчи, переворот строки и обход вложенных списков.
⏱️ ~30 мин·Средний·📚 2 урока
Числа Фибоначчи
Последовательность Фибоначчи начинается с 0 и 1, а каждое следующее число — сумма двух предыдущих: 0, 1, 1, 2, 3, 5, 8, 13... Её определение само по себе рекурсивно: F(n) = F(n−1) + F(n−2), с двумя базовыми случаями F(0) = 0 и F(1) = 1.
▶ fib.py
⚠️Осторожно
Эта красивая запись Фибоначчи очень медленная: fib(n) пересчитывает одни и те же значения многократно. Уже fib(35) заметно тормозит. Позже вы узнаете, как ускорить такие функцииИменованный блок кода, который можно вызывать многократно. Может принимать аргументы и возвращать результат. запоминанием результатов (мемоизация) или обычным циклом — но сейчас важна сама идея рекурсииПриём, при котором функция вызывает саму себя. Нужен базовый случай, чтобы вызовы завершились..
Переворот строки рекурсией
Рекурсивно строкуТекстовое значение в кавычках: "привет". Неизменяема. По-английски string (str). можно перевернуть так: «последний символ + перевёрнутый остаток». База — пустая строка, которую переворачивать не нужно.
▶ reverse.py
Разбор: reverse("abc") = "c" + reverse("ab") = "c" + "b" + reverse("a") = "cba". Срез s[:-1] отбрасывает последний символ, постепенно укорачивая строку до пустой.
💡Совет
Предскажите вывод. Что вернёт deep_sum([1, [2, 3], [4, [5]]]) ниже? Эта функция складывает все числа, даже спрятанные во вложенных списках.
▶ predict-deepsum.py
Вернётся 15 (1+2+3+4+5). Когда элемент оказывается списком, функция вызывает себя для него — так рекурсия добирается до любой глубины вложенности. Это классический приём обхода «деревьев» из вложенных структур.
⚠️ Частые ошибки новичков
Ошибка. Шаг рекурсии не приближает к базовому случаю. Например, передавать в вызов то же самое значение. Запустите код — он зациклится и упадёт с RecursionError. Почините: уменьшайте аргументЗначение, которое передаётся функции при вызове. Внутри функции оно доступно как параметр., чтобы дойти до базы (n - 1).
▶ broken-step.py
Заданиерешение.py
Напишите рекурсивную функцию count_digits(n), возвращающую количество цифр в неотрицательном целом числе. Например, count_digits(2026) → 4. База: однозначное число (n < 10) содержит 1 цифру.
Заданиерешение.py
Напишите рекурсивную функцию is_palindrome(s), которая возвращает True, если строка читается одинаково слева и справа. База: строка из 0 или 1 символа — палиндром. Шаг: первый и последний символы равны И середина — палиндром.
❓Проверь себя
Сколько базовых случаев у рекурсивного Фибоначчи F(n) = F(n-1) + F(n-2)?
Почему наивный рекурсивный Фибоначчи медленный?
Что должно делать со значением каждый шаг рекурсии?
ℹ️Важно
✅ Что вы узнали
Фибоначчи: F(n) = F(n−1) + F(n−2) с двумя базами.
Наивная рекурсия Фибоначчи медленна из-за повторных вычислений.
Строку можно перевернуть рекурсивно через срезы.
Рекурсия обходит вложенные структуры любой глубины.
Комментарии
Загрузка…
Загрузка комментариев…