我正在研究算法问题。我需要预先遍历一个有30000个节点的树。
通过我的实验,我发现当递归级别大于10000时,会导致堆栈溢出。我们知道一般树的预先遍历遍历的非递归版本并不容易实现,所以我试图让堆栈大小更大。
由于它是在线判断,我无法直接配置堆栈大小。我知道有一种方法可以用C ++编写一些#prgram指令来改变堆栈大小,所以我想在Scala中存在类似的东西。
答案 0 :(得分:1)
如果它的scala几乎肯定会在某种JVM上运行。堆栈大小是JVM在其生命周期内保持不变的属性之一。所以我猜你只是通过递归而运气不好。
看看: programatically setting max java heap size
如果它的尾部递归,你可以将其转换为迭代,但我想你已经知道了。
答案 1 :(得分:0)
我不知道你是否可以这样做但是......你听说过尾递归吗?这是一种改进递归函数的方法,而scala具有此功能。
从scala的创建者那里看看这个video,看看你是否可以采用类似的方式(至少对于最后一次调用,因为每个节点需要2次调用)。
答案 2 :(得分:0)
不,在Scala中没有办法做到这一点,但请注意,对于树遍历,它不是节点的数量,而是树的深度这很重要。换句话说,从根到最远叶子的距离。这些是在任何给定时间保持在堆栈中的唯一节点。对于30,000个节点平衡二叉树,该深度为15.需要相当多的不平衡才能达到接近10,000的深度。