有没有办法混合递归和yield
语句?例如,无限数生成器(使用递归)类似于:
def infinity(start):
yield start
# recursion here ...
>>> it = infinity(1)
>>> next(it)
1
>>> next(it)
2
我试过:
def infinity(start):
yield start
infinity(start + 1)
以及
def infinity(start):
yield start
yield infinity(start + 1)
但是他们没有一个做我想做的,第一个在它产生start
后停止,第二个产生start
,然后是生成器然后停止。
注意:请注意,我知道您可以使用while循环:
def infinity(start):
while True:
yield start
start += 1
我只想知道这是否可以递归地完成。
是的,你可以这样做:
不过,一旦达到最大递归深度,就会出错。
从Python3.3开始,您将能够使用
如果只是递归地调用生成器函数而不在其上循环或
yield from
-调用它,那么所做的只是构建一个新的生成器,而不实际运行函数体或生成任何结果。有关详细信息,请参见PEP 380。
在某些情况下,对于生成器,最好使用堆栈而不是递归。应该可以使用堆栈和while循环重写递归方法。
下面是一个递归方法的示例,该方法使用回调并可以使用堆栈逻辑重写:
上面的方法遍历一个节点树,其中每个节点都有一个
children
数组,该数组可能包含子节点。当遇到每个节点时,将发出回调并将当前节点传递给它。方法可以这样使用,在每个节点上打印出一些属性。
改用堆栈并将遍历方法编写为生成器
(请注意,如果希望与原来的遍历顺序相同,则需要反转子级的顺序,因为附加到堆栈的第一个子级将是最后一个子级。)
现在您可以获得与上面的
traverse_tree
相同的行为,但是使用生成器:这不是一刀切的解决方案,但是对于某些生成器,用堆栈处理代替递归可能会得到一个很好的结果。
相关问题 更多 >
编程相关推荐