[英]Python: recursion and return
作为练习,我试图制作一个脚本,该脚本将为我提供列表中各项的总和,但不使用SUM或FOR / WHILE循环。
我最终解决了:
def addition(data, total=0):
if data:
total += data.pop()
return total if data == [] else addition(data, total)
print(addition([1,2,3,1,2,1]))
这可以很好地工作并返回“ 10”,但是我的初始方法是:
def addition(data, total=0):
if data != []:
total += data.pop()
addition(data, total)
return total
print(addition([1,2,3,1,2,1]))
代码的第二位返回“ 1”而不是“ 10”。 我猜不出为什么这两种方法没有做同样的事情,或者甚至第二个示例在数据= []和totals = 10进入最终循环时出现了“ 1”我缺少关于变量作用域如何工作的规则?
(如以下答案中所述,它与可变范围无关,因此我更改了标题以反映该问题,以防将来发生此情况的任何人)
当您在total += data.pop()
调用total += data.pop()
,由于整数是不可变的,因此在调用函数中不会更改变量total
。
在函数返回之前,仅将要弹出的第一个元素1添加到total
。 为它做同样的事情,你想更换addition(data, total)
与return addition(data, total)
。
结果与可变范围无关。 您的第一个实现将递归调用的结果返回给addition
。 第二种实现则没有。 因此, total
不会在第一个元素之后更新。
def addition(data, total=0):
if data != []:
total += data.pop()
# addition(data, total) # return value not used; this line does not modify result
return total # total = 0 + first element
这两个功能均从原始列表中pop
,因此修改了输入数据。 考虑这样的替代方法:
def addition(data, total=0):
if data:
return addition(data[1:], total + data[0])
return total
如有疑问,请始终添加打印语句;)
def addition(data, total=0):
if data!= []:
total += data.pop()
print("Total is " + str(total))
addition(data, total)
return total
addition([1,2,3])
返回:
Total is 3
Total is 5
Total is 6
3
您知道错误在哪里吗? :)您对addition(data, total)
的返回值不做任何事情-此代码不执行任何操作。 您可以做的就是返回此值:
def addition(data, total=0):
if data!= []:
total += data.pop()
return addition(data, total)
return total
让我们分析一下这段代码的作用:如果data
为空-返回total
-我们已经添加了所有内容,无所事事。 如果data
不是一个空列表,它将从数据中弹出一个元素,将此值添加到total
并使用较短的列表重复该过程。 说服自己该代码确实可以实现您想要的功能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.