Рекурсия не работает с позиционными аргументами
Я пытаюсь сделать рекурсию умножения (умножение всех значений контейнера) в 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:])