🏠 Домашнее задание

⚡ Суть задания

Домашнее задание состоит из двух рекурсивных задач: сумма цифр числа и сумма чисел во вложенных списках.

Результат: два файла с функциями, которые корректно работают на заданных данных и проходят проверку в VS Code.

📋 Формулировка задания

Исходное задание из LMS:

  1. Сумма цифр числа
    Напишите рекурсивную функцию, которая находит сумму всех цифр числа.
    Данные: num = 43197
    Пример вывода: 24
  2. Сумма вложенных чисел
    Напишите рекурсивную функцию, которая суммирует все числа во вложенных списках.
    Данные: nested_numbers = [1, [2, 3], [4, [5, 6]], 7]
    Пример вывода: 28

🔧 Шаг 0. Подготовка окружения

Перед началом работы над любым заданием курса нужно настроить окружение. Эти шаги одинаковы для всех уроков.

📁 Структура репозитория: мы используем один репозиторий для всех практических работ курса. Это удобнее, чем много отдельных репозиториев: общий .gitignore, единая история, легко переключаться между уроками.
1

Создайте (или откройте) рабочую папку

В VS Code нажмите Ctrl+K Ctrl+O → выберите или создайте папку python-fundamentals-practice. Это будет корень вашего учебного репозитория.

# Или в терминале VS Code (Ctrl + `):
mkdir python-fundamentals-practice
cd python-fundamentals-practice
2

Инициализируйте 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: базовая структура репозитория"
3

Создайте папку для текущего урока

# Структура: lesson-XX/
mkdir -p lesson-46
cd lesson-46
4

Создайте виртуальное окружение (venv)

# Windows (PowerShell / CMD)
python -m venv venv
venv\Scripts\activate

# Mac / Linux
python3 -m venv venv
source venv/bin/activate

После активации в начале строки терминала появится (venv). Все дальнейшие команды выполняйте внутри venv.

5

Создайте ветку для задания

# Вернитесь в корень репозитория
cd ../..

# Создайте и переключитесь на ветку
git checkout -b lesson/46-recursion

# Отправьте ветку на удалённый репозиторий (если настроен)
git push -u origin lesson/46-recursion

Именование веток: lesson/XX-краткое-название. Это позволяет легко находить нужный урок.

🛠️ Шаги выполнения задания

Теперь, когда окружение готово, приступайте к решению.

1

Шаг 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:

  1. Убедитесь, что venv активирован.
  2. Запустите: python sum_digits.py
  3. Вывод должен быть: 24
2

Шаг 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:

  1. Запустите: python sum_nested.py
  2. Вывод должен быть: 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

🧪 Как проверить решение

  1. Активируйте venv: venv\Scripts\activate (Windows) или source venv/bin/activate (Mac/Linux).
  2. Запустите оба файла: python sum_digits.py и python sum_nested.py.
  3. Убедитесь, что вывод совпадает с примерами из задания.
  4. Попробуйте изменить входные данные и проверьте, что функции работают корректно.

🐛 Отладка в VS Code

Если что-то не работает:

  1. Поставьте точку останова (breakpoint) на строке с рекурсивным вызовом.
  2. Нажмите F5 или выберите «Run → Start Debugging».
  3. На панели Debug следите за значениями параметров на каждом уровне стека вызовов.
  4. Если появляется RecursionError, проверьте базовый случай и убедитесь, что аргумент приближается к нему.

💾 Сохранение работы

# Добавьте файлы урока
git add lesson-46/

# Сделайте коммит с осмысленным сообщением
git commit -m "lesson-46: рекурсия — сумма цифр и вложенных чисел"

# Отправьте на GitHub / GitLab
git push

💡 Советы и типичные ошибки

  • Не забудьте базовый случай — иначе получите RecursionError.
  • Убедитесь, что в рекурсивном вызове аргумент изменяется (например, n // 10 или n - 1).
  • Для вложенных структур используйте isinstance(), чтобы отличить число от списка.
  • Не коммитьте папку venv/ — она указана в .gitignore.