Рекурсия не работает с позиционными аргументами

Я пытаюсь сделать рекурсию умножения (умножение всех значений контейнера) в Python. Функция получает элементы списка в качестве позиционного аргумента (*n). При выполнении я получаю сообщение об ошибке "Максимальная глубина рекурсии достигнута". Тем не менее, код работает нормально, если я просто использую n вместо * n и отправляю элементы в списке.

Код не работает:

def multiply(*n):
    if n:       
        return n[0]*multiply(n[1:])
    else:
        return 1

multiply(5,1,4,9)

Рабочий код:

def multiply(n):
    if n:       
        return n[0]*multiply(n[1:])
    else:
        return 1

multiply([5,1,4,9])

2 ответа

Когда вы говорите функции ожидать произвольного числа позиционных аргументов с *nвам нужно разместить его в таком формате: с несколькими аргументами, а не с одним итератором, который содержит все аргументы. Если у вас есть одна итерация, элементы которой должны использоваться в качестве аргументов, вы должны распаковать ее с * когда ты это называешь Вторая функция работает, потому что она ожидает один итеративный аргумент, и вы отправляете ей один итеративный аргумент.

замещать n[1:] с *n[1:],

В первом фрагменте кода выражение

multiply(n[1:])

звонит multiply только с одним аргументом. А именно, остальная часть списка. Чтобы вызвать его с аргументами, равными содержанию списка n[1:], вы снова используете оператор splat, вот так:

multiply(*n[1:])

Другие вопросы по тегам