Set在Python中的递归函数中被清空

时间:2014-12-18 18:29:46

标签: python recursion

对于作业,我必须创建一个遍历人物字典的函数,并找到比指定参数更年轻的函数。字典是以每个人的方式编写的。有其他人附属于他们,他们的后代,也可能有后代等。我需要使程序工作,以便它通过指定人的所有后代,并返回小于{{1}的人}。问题是我在函数的开头定义了一个n,即使之后它被填充,函数返回的值仍然是set(),因为它具有递归性质。我该如何解决这个问题?

set()

以及数据:

def funct(name, n):
    younger = set()
    for child in people[name]:
        if age[child] < n:
            younger.add(child)
        funct(child, n)
    return younger

2 个答案:

答案 0 :(得分:1)

一种选择是明确传递set,在未提供时创建它(即在初始调用时):

def funct(name, n, younger=None):
    if younger is None:
        younger = set()
    for child in people[name]:
        if age[child] < n:
            younger.add(child)
        funct(child, n, younger)
    return younger

至于我设置默认younger=None的原因,请参阅"Least Astonishment" and the Mutable Default Argument

我还建议仅通过范围访问函数内的peopleage;使它们成为明确的参数。

答案 1 :(得分:0)

younger保留符合年龄要求的所有后代的姓名,而不仅仅是符合年龄要求的直系子女。

def funct(name, n):
    younger = set()
    for child in people[name]:
        if age[child] < n:
            younger.add(child)
        younger.update(funct(child, n))  # Changed line
    return younger