2015-12-02 44 views
0

我有一个循环遍历任意数量的对象的递归函数,并且他们的孩子收集年龄符合筛选年龄的孩子。python - 从递归函数返回对象的平面列表

在这种情况下,我正在寻找循环每个人和他们的孩子收集任何人的年龄是2或4.但我不完全知道如何不断建立一个单子,然后返回它。现在它只返回最后找到的Person。

UPDATED 我对递归函数做了一些更改,总是附加到传递的变量。这是一个合适的解决方案?

from random import randint 

NODES = [] 

class Person(): 
    def __init__(self, name="", age=0, children=None): 
     self.name = name 
     self.age = (randint(0,4)) 
     self.children = children if children is not None else [] 

for x in xrange(5): 
    new = Person() 
    NODES.append(new) 
    for c in xrange(5): 
     new.children.append(Person()) 


def get_nodes(items=[], ages=[], results=[]): 
    print "Searching..." 
    # pseudo code 
    for item in items: 
     if item.age in ages: 
      print "\t","valid age" 
      results.append(item) 

     results + get_nodes(items=item.children, ages=ages, results=results) 

    return results 


AGED_NODES = get_nodes(items=NODES, ages=[2, 4], results=[]) 
print len(AGED_NODES) 
print AGED_NODES 
+0

把它包在非递归函数A和从A返回扁平列表 – erip

回答

3

它似乎总是更符合逻辑的我,像get_nodes递归函数应该只返回了自己的成果 - 呼叫者可以添加自己的结果,并呼叫者的呼叫者不相同。所以不,我不会把'结果'传递给get_nodes。

另外请注意,您的线路:

results + get_nodes(items=item.children, ages=ages, results=results) 

什么都不做。

所以我对你的代码的版本会是什么样子:

def get_nodes(items=[], ages=[]): 
    myresults = [] 
    print "Searching..." 
    # pseudo code 
    for item in items: 
     if item.age in ages: 
      print "\t","valid age" 
      myresults.append(item) 

     myresults.extend(get_nodes(items=item.children, ages=ages)) 

    return myresults