Как работает эта рекурсия в пайтон?

def sum(list):
    if list == []:
        return 0
    else: 
        return list[0] + sum(list[1:])

print(sum([1,2,3]))

пожалуй самый главный вопрос это - что делает двоеточие в вызове функции? + sum(list[1:]) там где 1:


Ответы (2 шт):

Автор решения: Павел

: в индексах списка называется - срез (slice).

Самый базовый пример:

a = [1, 2, 3]

a[i:j] - возвращает все элементы списка начиная с i, заканчивая j-1

Тогда a[0:2] - вернёт первый и второй элемент списка:

print(a[0:2]) -> [1, 2]

Так же есть сокращенная запись срезов (как и у вас в примере), мы можем не указывать либо начальный индекс i, либо конечный индекс j, и тогда автоматически будут браться элементы либо с начала (в случае пропуска i), либо с конца (в случае пропуска j)

Тогда вызов a[0:2] будет аналогичен вызову a[:2], а вызов a[0:3] аналогичен вызову a[0:], или просто a.

→ Ссылка
Автор решения: CrazyElf
def sum(list):
    ...
    return list[0] + sum(list[1:])

Дополню всё же, что по сути рекурсия тут сводится к такой формуле

сумма(список) = первый элемент списка + сумма(остальные элементы списка)

Ну и отдельно тут ещё обработан случай, когда в списке остался один элемент и тогда "остальные элементы списка" - это пустой список. Заодно то, как это тут сделано, нормально позволяет обработать случай, когда список изначально пустой.

→ Ссылка