Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
超出Python树遍历递归深度_Python_Algorithm_Optimization_Tree - Fatal编程技术网

超出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节点之后,我需要在当前节点上进行处理。我不确定将当前节点存放在何处/如何存放以备将来处理-在单独的堆栈上?通常有更好的方法来实现树遍历(尽管它们可能会因指针旋转和其他操作而变得复杂),而不是使用“堆栈”。毕竟,如果在堆上使用堆栈,那么实际上并没有节省太多空间(除了常数因子之外,因为需要节省更少的状态)