超出Python树遍历递归深度
我有一个段树,它保存一系列数字的数据(选择的数据结构)。代码如下:超出Python树遍历递归深度,python,algorithm,optimization,tree,Python,Algorithm,Optimization,Tree,我有一个段树,它保存一系列数字的数据(选择的数据结构)。代码如下: class SegmentTree: def __init__(self, N): def _init(b, e): if b is e: data = foo() # No dependency return Node(b, e, data, None, None) else:
class SegmentTree:
def __init__(self, N):
def _init(b, e):
if b is e:
data = foo() # No dependency
return Node(b, e, data, None, None)
else:
mid = (b + e ) / 2
L = _init(b, mid)
R = _init(mid + 1, e)
data = foo() #Data depends on L and R
return Node(b, e, data, L, R)
self.root = _init(1, N)
这将在N约300时失败,并出现“超过最大递归深度”错误。有没有一种方法可以迭代而不是递归地创建树?通常,从递归转换为迭代的方法是手动维护堆栈(或队列) 比如:
while stack is not empty:
item = pop from stack
do processing (such as adding onto the node)
push L and R onto the stack
堆栈在内存中确实会增长,因为对于弹出的每个项目,都会推两个。真正的问题不是算法的递归深度,对于300这样的值,递归深度应该是10左右,而是将数字与
进行比较。is
关键字检查对象标识,而==
检查相等性:
>>> 300 == 299+1
True
>>> 300 is 299+1
False
因此,应该终止递归的if
条件永远不会为真,并且函数将继续递归,即使b
和e
相等
如果更改If
,此问题应消失:
if b == e:
...
对于较小的数字,这个问题可能不会发生,因为Python对int的处理达到了一定的大小。是的,我想这样做,但在(递归地)创建L和R节点之后,我需要在当前节点上进行处理。我不确定将当前节点存放在何处/如何存放以备将来处理-在单独的堆栈上?通常有更好的方法来实现树遍历(尽管它们可能会因指针旋转和其他操作而变得复杂),而不是使用“堆栈”。毕竟,如果在堆上使用堆栈,那么实际上并没有节省太多空间(除了常数因子之外,因为需要节省更少的状态)