繁体   English   中英

Python:递归并返回

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM