【问题标题】:Creating a generator out of a recursive function从递归函数中创建生成器
【发布时间】:2017-08-01 03:25:40
【问题描述】:

我在 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

但上面的代码并没有给出与简单地打印节点值的代码相同的输出,即使我认为它们在逻辑上应该是相同的。很明显,我试图将我的方法变成生成器的尝试是不正确的。

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

【问题讨论】:

  • 输出有何不同?你能提供一些示例输入/输出吗?

标签: python generator


【解决方案1】:
for node in self.zigzag_traversal(False,node.getRight()):

乍一看,我怀疑问题出在这里。您使用node 既作为被迭代的变量的名称,又作为在调用traversal 时使用的对象。如果您在第一个循环中掩盖了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())

【讨论】:

  • 啊!我的匆忙,我忽略了我正在隐藏变量的事实。谢谢!
猜你喜欢
  • 2016-04-03
  • 1970-01-01
  • 2012-04-06
  • 2015-01-19
  • 2012-10-24
  • 1970-01-01
  • 2023-03-24
  • 2015-05-14
  • 1970-01-01
相关资源
最近更新 更多