如果你有一个二叉树,你如何使用尾递归迭代(按顺序使用)?我知道尾部递归涉及您在迭代时计算新值,然后当您到达基本情况时,您只需返回累积。但是当你必须两次调用函数调用时,你如何为树做这个?
答案 0 :(得分:7)
假设深度优先从左到右遍历,则不能对左侧分支使用尾递归,但可以将其用于右侧分支。
示例方案代码(假设您的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)))