2011-10-27 75 views
8

假設在C++中,你對遞歸函數做了太多的遞歸調用,並且出現堆棧溢出錯誤。C++如何使用延續傳遞樣式?

你會如何以延續傳遞的風格重寫這個以避免堆棧溢出?

我在C++中描述這個有點困難。

+2

對於這樣一個抽象問題,你不會得到任何東西,只能得到抽象的答案。也許你應該發佈導致堆棧溢出的示例函數,然後你會得到如何解決它的具體答案。 (親自嘗試重寫函數以使用累加器,然後重寫它以使用延續...) – ildjarn

+0

您來到了正確的位置。 –

+0

@ildjarn,感謝您的通知。我其實在尋找一個抽象的答案。如果我使用累加器,是不是最終將它重寫爲C++中的正常迭代? – achow

回答

4

那麼這是一個相當開放的問題,但Eric Lippert寫了一個(實際上是兩個)而不是long series about exactly this topic。不完全正確的語言,但它應該仍然是相當有用的,並給出總體思路。

儘管在C++中實現CPS似乎只是修復單個遞歸函數的很多工作,但您可以使用某種算法使該函數與隊列迭代(您仍然使用基本相同的數據量,但該堆遠不如限制)。

+1

我在將詞彙關閉作爲內置語言功能的語言環境中編寫了這兩個系列的獨特優勢。將C++代碼重寫爲閉包當然是完全可以實現的,但這會有點痛苦。 –

+1

@EricLippert你是對的我假設C++ 11 lambda表達式,但顯然不是每個人(甚至不接近大多數)有一個支持lambdas的編譯器。沒有它,它會變得更加複雜(使用類並將其推廣到大概?)。順便說一句,謝謝你的偉大的文章 - 沒有你,我甚至不知道什麼CPS是:) – Voo

+2

@Voo:即使沒有C++ 11 lambda,也有C++ 03庫處理這種平凡。見例如[Boost.Phoenix](http://www.boost.org/libs/phoenix/)。 – ildjarn