如果你有一個二叉樹,你如何使用尾遞歸迭代(按順序使用)?我知道尾遞歸涉及到迭代時計算新值,然後當您到達基本情況時,您只需返回累積。但是當你必須調用兩次函數調用時,你如何爲樹做這件事?如何做二叉樹的尾遞歸?
2
A
回答
6
假設深度優先從左到右遍歷,您不能對左手分支使用尾遞歸,但可以將其用於右分支。
實施例方案的代碼(假設你tree
有三個存取器函數,value
,left
,和right
):
(define (collect-in-order tree)
(define (collect node result)
(if node
(collect (right node)
(cons (value node)
(collect (left node) result)))
result))
(reverse (collect tree '())))
的(collect (right node) ...)
是在尾部位置,所以這是一個尾調用。
你也可以做一個從右到左遍歷,在這種情況下,它的左側下坡是尾遞歸:
(define (collect-in-order tree)
(let collect ((node tree)
(result '()))
(if node
(collect (left node)
(cons (value node)
(collect (right node) result)))
result)))
相關問題
- 1. 遞歸遍歷二叉樹
- 2. 遞歸二叉樹函數
- 3. 遞歸和在二叉樹
- 4. Java遞歸二叉樹
- 5. 在二叉樹中遞歸
- 6. 二叉樹Sorrt Java遞歸
- 7. Scala中的二叉樹上的尾遞歸摺疊
- 8. 斯卡拉二叉樹尾遞歸的總和
- 9. 樹叉()遞歸
- 10. 二叉樹的遞歸問題
- 11. 遞歸搜索二叉樹的C#
- 12. 用於二叉樹的遞歸插入
- 13. C中的遞歸二叉樹插入
- 14. 找到最小遞歸的二叉樹
- 15. Java中二叉樹的遞歸檢查
- 16. Java幫助遞歸和二叉樹
- 17. 二叉搜索樹遞歸添加
- 18. 遞歸搜索二叉樹問題
- 19. 遞歸遍歷二叉查找樹
- 20. C++二叉樹遞歸析構問題
- 21. 蟒海龜遞歸二叉樹
- 22. 二叉樹:非遞歸例程打印二叉樹節點的祖先?
- 23. 如何理解二叉樹中的以下遞歸函數?
- 24. 如何構建一個非遞歸的二叉樹?
- 25. 二叉樹 - 如何遍歷遞歸沒有任何參數
- 26. 遞歸使用樹的高度的二叉樹的直徑?
- 27. 二叉樹 - 斯卡拉遞歸的樹木
- 28. java中的二叉查找樹遞歸子樹
- 29. 這個二叉搜索樹算法如何遞歸
- 30. 我如何可以遞歸插入Fibonacci序列爲二叉樹
任何遞歸函數可以使用CPS轉換成尾遞歸。 [這個問題](http://stackoverflow.com/questions/9323036/tail-recursive-function-to-find-depth-of-a-tree-in-ocaml)顯示瞭如何在OCAML中做尾巴二叉樹處理遞歸。 – Barmar 2013-02-11 04:21:35
@Barmar有趣的是,我經常聽到「我們可以使用CPS實現尾遞歸」。對於正確的尾遞歸的Scheme定義實際上並不是這樣,它指定無界尾遞歸不應該使用無界的內存。如果CPS描述了真正的尾遞歸過程,那確實適用;否則,你的延續鏈將是無限的長度。 – 2016-07-08 14:43:05