Что выведет этот код?


def recursive_sum(n, total=0):
    if n == 0:
        return total
    return recursive_sum(n-1, total+n)

print(recursive_sum(3))

Функция recursive_sum(n, total=0) рекурсивно вычисляет сумму чисел от 1 до n.

Базовый случай: если n == 0, функция возвращает накопленную сумму total.

Рекурсивный случай: функция вызывает сама себя с аргументами n-1 и total+n, добавляя текущее значение n к сумме.

Вызов print(recursive_sum(3)) вернет 6, так как 1 + 2 + 3 = 6.


Задача: Реализовать рекурсивную функцию, вычисляющую сумму чисел от 1 до n.

Решение:


def recursive_sum(n, total=0):
    if n == 0:
        return total
    return recursive_sum(n-1, total+n)

print(recursive_sum(3))
  

Разбор решения:

  • Функция recursive_sum(n, total=0) принимает два аргумента:
    • n: Целое число, определяющее верхнюю границу диапазона суммирования (от 1 до n).
    • total: Аккумулятор суммы. По умолчанию равен 0. Использование аккумулятора позволяет избежать переполнения стека вызовов для больших значений n.
  • Базовый случай: Если n равно 0, функция возвращает текущее значение total. Это условие завершает рекурсию.
  • Рекурсивный случай: Если n не равно 0, функция вызывает саму себя с аргументами n-1 и total+n. Это добавляет текущее значение n к аккумулятору total и уменьшает n на 1 для следующего рекурсивного вызова.
  • Пример выполнения: recursive_sum(3)
    1. recursive_sum(3, 0) -> recursive_sum(2, 3)
    2. recursive_sum(2, 3) -> recursive_sum(1, 5)
    3. recursive_sum(1, 5) -> recursive_sum(0, 6)
    4. recursive_sum(0, 6) -> 6
  • Следовательно, print(recursive_sum(3)) выведет 6 (1 + 2 + 3).

Дополнительно:

  • Данная реализация является хвостовой рекурсией, что позволяет компилятору (в некоторых языках) оптимизировать код и избежать переполнения стека вызовов. Однако, CPython не оптимизирует хвостовую рекурсию, поэтому для очень больших значений n все равно может возникнуть ошибка переполнения стека. В таких случаях лучше использовать итеративный подход.
0