*args in recursion: TypeError: unsupported operand type(s) for +: 'int' and 'tuple'

*args in recursion: TypeError: unsupported operand type(s) for +: 'int' and 'tuple'

我正在学习python。尝试在递归函数中使用 *args 作为参数(用于添加 'n' 数字),但出现错误: 下面是我的代码和错误:


def add(*n):
  if len(n) == 1:
    return n[0]
  else:
    sum =  n[len(n)-1] + add(n[:-1])
  return sum  


a = add(2,4,6)
print(a)

错误:

Traceback (most recent call last):
  File "/tmp/sessions/9d1de49c52e0e9b9/main.py", line 22, in <module>
    a = add(2,4,6)
  File "/tmp/sessions/9d1de49c52e0e9b9/main.py", line 18, in add
    sum =  n[len(n)-1] + add(n[:-1])
TypeError: unsupported operand type(s) for +: 'int' and 'tuple'

请解释我做错了什么

n[:-1] 正在返回一个元组,要将最后一个值添加到 add(n[-1]) 编辑: 工作解决方案:


def add(*n):
    if len(n) == 1:
        return n[0]
    else:
        return n[-1] + add(*n[:-1])


我建议一个更简单的设置:

def add(*n):
    if len(n) == 1:
        return n[0]
    return n[0] + add(*n[1:])    # n[1:] gives the "rest" of a list, i.e. all elements after the first. 
  • 在一个函数定义 (def add(*n):)中,星星将多个单独的参数收集到一个列表中。
    例如当您调用 add(2, 4, 6) 时,n 将是一个列表 [2, 4, 6]
  • 在函数 调用 (add(*n)) 中,star 将一个列表扩展为多个单独的参数。
    例如当您有 n = [2, 4, 6] 时,调用 add(*n) 就好像您调用了 add(2, 4, 6)

为了列出收集其参数的函数,您需要先将其展开。

您的代码做了第一件事,但没有做第二件事。这就是它不起作用的原因:

def add(*n):                            # <-- collecting multiple arguments into a list
  if len(n) == 1:
    return n[0]
  else:
    sum =  n[len(n)-1] + add(n[:-1])    # <-- not spreading list into multiple arguments
  return sum  

FWIW,更短的实现会像这样

def add(*n):
    return 0 if not n else n[0] + add(*n[1:])