2011-02-09 60 views
5

erlang中的尾遞歸比前向遞歸更適合性能?
或者erlang編譯器也優化了前向遞歸嗎?
我的意思是,是否有任何理由使用尾遞歸而不是前向遞歸?
在我看來,前向遞歸看起來更漂亮。Erlang中的尾遞歸與前向遞歸

回答

3

尾遞歸通常更好,因爲它使用較少的內存。您只需將下一次調用所需的內容帶到堆棧上,從而最大限度地減少堆棧上的內存使用率。此外,當尾遞歸代碼被優化時,不需要的函數返回被丟棄,這在某些情況下會稍微快一些。

例如,如果函數的返回值是對另一個函數的調用,則不需要將中間函數保留在堆棧上。所以代碼直接從內部函數跳回到調用者。

非尾遞歸優化爲在某些情況下由Erlang編譯器遞歸遞歸,但不要指望它。儘可能編寫尾遞歸函數是一個好習慣。

10

尾遞歸和正向遞歸是完全不同的概念。 看到這個discussion

可以編寫一個尾遞歸的前向遞歸,從而進行優化。也可以寫一個不是尾遞歸的前向遞歸:在這種情況下,它不會被優化,即它將消耗堆棧空間。