如果你有一个二叉树,你如何使用尾递归迭代(按顺序使用)?我知道尾递归涉及到迭代时计算新值,然后当您到达基本情况时,您只需返回累积。但是当你必须调用两次函数调用时,你如何为树做这件事?如何做二叉树的尾递归?
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. 二叉树Sorrt Java递归
- 5. 在二叉树中递归
- 6. PHP - 递归二叉树
- 7. 递归二叉树插入
- 8. Java递归和二叉树
- 9. 递归二叉树插入
- 10. 递归和二叉树
- 11. 递归二叉树函数
- 12. 递归搜索二叉树
- 13. Java递归二叉树
- 14. 递归和在二叉树
- 15. 递归遍历二叉树
- 16. 如何递归生成二叉树?
- 17. Scala中的二叉树上的尾递归折叠
- 18. 斯卡拉二叉树尾递归的总和
- 19. 树叉()递归
- 20. 递归搜索二叉树的C#
- 21. 二叉树的递归问题
- 22. 二叉树的递归函数
- 23. C中的递归二叉树插入
- 24. 用于二叉树的递归插入
- 25. 二叉树的递归代码流
- 26. 找到最小递归的二叉树
- 27. 二叉树上的递归删除
- 28. Java中二叉树的递归检查
- 29. 二叉树元素的递归printf
- 30. 二叉树的递归副本
任何递归函数可以使用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