【发布时间】:2015-02-10 07:07:12
【问题描述】:
我正在使用 Racket,但该问题适用于支持尾递归的任何方案。
我熟悉在平面列表上实现尾递归的传统模式,大致是这样的:
(define (func x [acc null])
(if (null? x)
acc
(func (cdr x) (cons (do-something-to (car x)) acc))))
在这种情况下,func 位于尾部位置。
但是当我使用树时,即具有递归嵌套列表的列表时,我最终会使用 map 进行递归下降,如下所示:
(define (func2 x)
(cond
[(atom? x) (do-something-to x)]
[(list? x) (map func2 x)]))
这可行,但func2 不再处于尾部位置。
您能否——如果可以,您将如何——以尾递归的方式重写func2?
(抛开它是否提高性能的问题,这不是我要问的问题。)
【问题讨论】:
-
继续传递样式是另一种选择。我现在没有时间发布完整的答案,但是 my answer 到 Replacing a symbol in a symbolic expression 显示了一种尾递归方法(通过 CPS)来遍历(并替换)一棵树。
标签: algorithm recursion scheme racket tail-recursion