gpt4 book ai didi

python - 从递归函数创建生成器

转载 作者:太空宇宙 更新时间:2023-11-03 15:33:32 25 4
gpt4 key购买 nike

我在 BinaryTree 类中创建了一个方法,以锯齿形方式遍历树。

def zigzag_traversal(self,l2r_flag=True,node=DEFAULT):
"""
traverse binary tree in zigzag manner
ALG: pass an additional boolean variable. if variable is true call left to right,
if variable is false call right to left
"""
if node == DEFAULT:
node = self.__root
if node is None:
return
if node is not None:
print node.getData()
if l2r_flag == True:
self.zigzag_traversal(False,node.getRight())
self.zigzag_traversal(False,node.getLeft())
else:
self.zigzag_traversal(True,node.getLeft())
self.zigzag_traversal(True,node.getRight())

上面的代码从逻辑上来说是正确的。

现在,我不再打印数据,而是尝试将其转换为生成器并生成节点,以便其他方法可以用它做其他事情。

我查看了有关堆栈溢出的其他问题/答案,并修改了我的代码以产生而不是打印,如下所示。

def zigzag_traversal(self,l2r_flag=True,node=DEFAULT):
"""
traverse binary tree in zigzag manner
ALG: pass an additional boolean variable. if variable is true call left to right,
if variable is false call right to left
"""
if node == DEFAULT:
node = self.__root
if node is None:
return
if node is not None:
yield node
if l2r_flag == True:
for node in self.zigzag_traversal(False,node.getRight()):
yield node
for node in self.zigzag_traversal(False,node.getLeft()):
yield node
else:
for node in self.zigzag_traversal(True,node.getLeft()):
yield node
for node in self.zigzag_traversal(True,node.getRight()):
yield node

但是上面的代码并没有给出与简单打印节点值的代码相同的输出,尽管我认为它们在逻辑上应该是相同的。很明显,我将方法转变为生成器的尝试是错误的。

我的问题是如何转换原始代码以生成节点而不是正确打印它们?

最佳答案

for node in self.zigzag_traversal(False,node.getRight()):

乍一看,我怀疑问题就出在这里。您使用 node 既作为要迭代的变量的名称,又作为调用遍历 时使用的对象。如果您在第一个循环中遮盖了 node,那么当您进入第二个循环时,它不会有正确的值。

尝试为迭代变量选择不同的名称。

for x in self.zigzag_traversal(False,node.getRight()):
yield x
for x in self.zigzag_traversal(False,node.getLeft()):
yield x

或者,升级到 Python 3.X,您可以使用 yield from 语句来代替创建新名称来生成它。

yield from self.zigzag_traversal(False,node.getRight())
yield from self.zigzag_traversal(False,node.getLeft())

关于python - 从递归函数创建生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42724222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com