2013-02-11 75 views
2

如果你有一个二叉树,你如何使用尾递归迭代(按顺序使用)?我知道尾递归涉及到迭代时计算新值,然后当您到达基本情况时,您只需返回累积。但是当你必须调用两次函数调用时,你如何为树做这件事?如何做二叉树的尾递归?

+0

任何递归函数可以使用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

+1

@Barmar有趣的是,我经常听到“我们可以使用CPS实现尾递归”。对于正确的尾递归的Scheme定义实际上并不是这样,它指定无界尾递归不应该使用无界的内存。如果CPS描述了真正的尾递归过程,那确实适用;否则,你的延续链将是无限的长度。 – 2016-07-08 14:43:05

回答

6

假设深度优先从左到右遍历,您不能对左手分支使用尾递归,但可以将其用于右分支。

实施例方案的代码(假设你tree有三个存取器函数,valueleft,和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))) 
+0

这是'为了散步'吗? – omega 2013-02-11 04:07:49

+0

当然,使用这种策略可以实现按顺序的遍历。 – 2013-02-11 04:08:38

+0

那怎么办呢? – omega 2013-02-11 04:09:48