📋 Формулировка задания
Исходное задание из LMS:
-
Сумма цифр числа
Напишите рекурсивную функцию, которая находит сумму всех цифр числа.
Данные:num = 43197
Пример вывода:24 -
Сумма вложенных чисел
Напишите рекурсивную функцию, которая суммирует все числа во вложенных списках.
Данные:nested_numbers = [1, [2, 3], [4, [5, 6]], 7]
Пример вывода:28
🔧 Шаг 0. Подготовка окружения
Перед началом работы над любым заданием курса нужно настроить окружение. Эти шаги одинаковы для всех уроков.
.gitignore, единая история, легко переключаться между уроками.
Создайте (или откройте) рабочую папку
В VS Code нажмите Ctrl+K Ctrl+O → выберите или создайте папку python-fundamentals-practice. Это будет корень вашего учебного репозитория.
# Или в терминале VS Code (Ctrl + `):
mkdir python-fundamentals-practice
cd python-fundamentals-practice
Инициализируйте Git-репозиторий (один раз)
Если папка ещё не является git-репозиторием:
git init
# Создайте базовые файлы
echo "# Python Fundamentals — Практические работы" > README.md
echo "venv/" > .gitignore
echo "__pycache__/" >> .gitignore
echo "*.pyc" >> .gitignore
echo ".env" >> .gitignore
git add README.md .gitignore
git commit -m "init: базовая структура репозитория"
Создайте папку для текущего урока
# Структура: lesson-XX/
mkdir -p lesson-46
cd lesson-46
Создайте виртуальное окружение (venv)
# Windows (PowerShell / CMD)
python -m venv venv
venv\Scripts\activate
# Mac / Linux
python3 -m venv venv
source venv/bin/activate
После активации в начале строки терминала появится (venv). Все дальнейшие команды выполняйте внутри venv.
Создайте ветку для задания
# Вернитесь в корень репозитория
cd ../..
# Создайте и переключитесь на ветку
git checkout -b lesson/46-recursion
# Отправьте ветку на удалённый репозиторий (если настроен)
git push -u origin lesson/46-recursion
Именование веток: lesson/XX-краткое-название. Это позволяет легко находить нужный урок.
🛠️ Шаги выполнения задания
Теперь, когда окружение готово, приступайте к решению.
Шаг 1: сумма цифр числа
Создайте файл sum_digits.py и реализуйте рекурсивную функцию.
# sum_digits.py
def sum_digits(n: int) -> int:
"""Возвращает сумму цифр неотрицательного целого числа."""
n = abs(n)
if n == 0:
return 0
return n % 10 + sum_digits(n // 10)
num = 43197
print(sum_digits(num))
Проверка в VS Code:
- Убедитесь, что venv активирован.
- Запустите:
python sum_digits.py - Вывод должен быть:
24
Шаг 2: сумма вложенных чисел
Создайте файл sum_nested.py и реализуйте рекурсивную функцию.
# sum_nested.py
from typing import Iterable
def sum_nested(numbers) -> int:
"""Суммирует все целые числа во вложенных списках."""
if isinstance(numbers, int):
return numbers
if isinstance(numbers, Iterable) and not isinstance(numbers, (str, bytes)):
return sum(sum_nested(item) for item in numbers)
return 0
nested_numbers = [1, [2, 3], [4, [5, 6]], 7]
print(sum_nested(nested_numbers))
Проверка в VS Code:
- Запустите:
python sum_nested.py - Вывод должен быть:
28
✅ Полное решение
Ниже приведены оба решения в одном файле. Совет: попробуйте выполнить задание самостоятельно, прежде чем смотреть ответ.
# homework_46.py
from typing import Iterable
def sum_digits(n: int) -> int:
"""Возвращает сумму цифр неотрицательного целого числа."""
n = abs(n)
if n == 0:
return 0
return n % 10 + sum_digits(n // 10)
def sum_nested(numbers) -> int:
"""Суммирует все целые числа во вложенных списках."""
if isinstance(numbers, int):
return numbers
if isinstance(numbers, Iterable) and not isinstance(numbers, (str, bytes)):
return sum(sum_nested(item) for item in numbers)
return 0
if __name__ == "__main__":
num = 43197
nested_numbers = [1, [2, 3], [4, [5, 6]], 7]
print(sum_digits(num)) # 24
print(sum_nested(nested_numbers)) # 28
🧪 Как проверить решение
- Активируйте venv:
venv\Scripts\activate(Windows) илиsource venv/bin/activate(Mac/Linux). - Запустите оба файла:
python sum_digits.pyиpython sum_nested.py. - Убедитесь, что вывод совпадает с примерами из задания.
- Попробуйте изменить входные данные и проверьте, что функции работают корректно.
🐛 Отладка в VS Code
Если что-то не работает:
- Поставьте точку останова (breakpoint) на строке с рекурсивным вызовом.
- Нажмите F5 или выберите «Run → Start Debugging».
- На панели Debug следите за значениями параметров на каждом уровне стека вызовов.
- Если появляется
RecursionError, проверьте базовый случай и убедитесь, что аргумент приближается к нему.
💾 Сохранение работы
# Добавьте файлы урока
git add lesson-46/
# Сделайте коммит с осмысленным сообщением
git commit -m "lesson-46: рекурсия — сумма цифр и вложенных чисел"
# Отправьте на GitHub / GitLab
git push
💡 Советы и типичные ошибки
- Не забудьте базовый случай — иначе получите
RecursionError. - Убедитесь, что в рекурсивном вызове аргумент изменяется (например,
n // 10илиn - 1). - Для вложенных структур используйте
isinstance(), чтобы отличить число от списка. - Не коммитьте папку
venv/— она указана в.gitignore.