假設我有一棵樹使用深度優先搜索遍歷,而我遍歷它的算法看起來是這樣的:如何將遞歸函數轉換爲使用堆棧?
algorithm search(NODE):
doSomethingWith(NODE)
for each node CHILD connected to NODE:
search(CHILD)
現在,在許多語言中有一個最大深度遞歸,例如,如果遞歸的深度超過了一定的限制,那麼程序會因堆棧溢出而崩潰。
這個函數如何在沒有遞歸的情況下實現,而是使用堆棧?在很多情況下,有很多局部變量;他們在哪裏可以儲存?
我發現這個問題有一個無意的幽默元素,因爲大多數編程語言(儘管不是全部)會在內部使用堆棧。當然,還有一個事實是,對於大多數語言來說,通過深度優先搜索來達到遞歸限制要求您有一個非常不平衡的樹或非常非常大的樹,因爲您需要深度大約1000個和大多數平衡二叉樹的元素數量等於2^depth - 1,這意味着,對於那棵樹,在溢出之前需要2^1000-1個元素。 – JAB 2010-08-02 20:11:59
而且,當然,由於語言無論如何都可能使用堆棧來實現遞歸,所以導致遞歸形式溢出的問題也可能成爲顯式使用堆棧版本的問題。 (雖然我不覺得這是一個糟糕的問題,但我現在只是感覺有些失落,並且心情很亂)。 – JAB 2010-08-02 20:14:26
事實上,我的樹非常非常大,雖然有一個大量相同的節點。因此,相同的節點被緩存在散列表中,但該樹仍然非常大。 – Ran 2010-08-02 20:19:30