-1

我正在尝试在 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])
4

2 回答 2

0

在第一段代码中,表达式

multiply(n[1:])

只用一个参数调用multiply。即,列表的其余部分。为了使用等于 list 内容的参数调用它n[1:],您再次使用 splat 运算符,如下所示:

multiply(*n[1:])

于 2017-03-15T03:23:54.363 回答
0

当你告诉一个函数期望任意数量的位置参数时*n,你需要以这种格式来适应它:使用多个参数,而不是使用包含所有参数的单个迭代。如果你有一个单一的迭代,它的元素应该用作参数,你必须*在调用它时解包它。第二个函数之所以有效,是因为它需要一个可迭代的参数,而您向它发送一个可迭代的参数。

替换n[1:]*n[1:]

于 2017-03-15T03:24:01.833 回答