python - 递归函数不递归

标签 python recursion

我正在尝试横穿由字典字典组成的树状结构,其中最低级别的字典包含列表。下面是一个结构示例:

Metabolism[currentL0][currentL1][currentL2][node] = [pathway1, pathway2, pathway3]

我使用这个函数来创建数据结构:

Tree = lambda: defaultdict(Tree)
Metabolism = Tree()

生成和填充数据结构的代码有效。但是,我尝试使用递归生成器来遍历“树”并返回顶部键以及与其关联的所有列表。生成器函数通过 if isinstance 测试工作。它进入 if block 打印 hi 并将正确的值分配给 key,但是,它似乎跳过了递归调用并打印 再见。为了测试这一点,我将 print key 语句放置在函数顶部,并在递归调用中将 key 设置为 recursive,以便 print key 语句应该打印单词 recursive,但事实并非如此。这是生成器函数:

def walk_dict(d,depth=0,key=""):
   print key
   for k,v in d.items():
      if isinstance(v, defaultdict):
         print "hi"
         if depth == 0:
            key = k
         walk_dict(v,depth+1,"recursive")
         print "bye"
      else:
         yield key, v

测试 print 语句似乎确认该函数不是递归的。它打印一个空行,后跟与顶级字典键相同数量的 hibye。以下是输出示例:

<blank line>
hi
bye
hi
bye
hi
bye
hi
bye
hi
bye
hi
bye

最后,这是调用生成器函数的代码:

for x,y in walk_dict(Metabolism):
    pass

最佳答案

问题是当你进行递归调用时,你没有产生结果。替换这一行:

         walk_dict(v,depth+1,"recursive")

用这一行:

         for item in walk_dict(v,depth+1,"recursive"):
             yield item

如果您运行的是 Python 3,则可以使用 yield from 构造:

         yield from item in walk_dict(v,depth+1,"recursive"):

更新

要回答您的问题,请考虑以下调用的作用:

         walk_dict(v,depth+1,"recursive")

在原始代码中,您只需调用 walk_dict,它会返回一个生成器。但是,您没有从该生成器中提取任何有用的列表并返回给调用者。

关于python - 递归函数不递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31237883/

相关文章:

python - 如何提高sqlite3建表的性能

python - 如何在终端窗口中打印/显示 telnet session 的输出 (Python)

python - FTP上传文件Python

python - 我需要在 python 中运行 TCL 脚本,我的 TCL 脚本还有一个用户定义的(内部)包

java - 如何知道当前的递归级别?

python - PyQt 中的 StandardContextMenu 国际化

recursion - 定义递归依赖字段时 Coq 类型类出现问题

C++迭代组合函数不起作用

有人可以向我解释这有效吗?

c - 递归、全局变量和 OpenMP