代码之家  ›  专栏  ›  技术社区  ›  Rhangaun

寻找一个典型的树递归转化为尾部递归形式的例子

  •  1
  • Rhangaun  · 技术社区  · 14 年前

    任何类似于扁平化、计数原子等的嵌套列表都可以。

    顺便说一句,我对CPS转换或“对树”不感兴趣。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Nathan Shively-Sanders    14 年前

    您可以用一个记录下一个要处理的树的堆栈来编写一个循环。你还需要一个蓄电池。但这和CPS没什么不同,所以它可能不是你想要的。

    (define (atom? x) 
      (not (pair? x)))
    (define (size tree)
      (let loop ((t tree) (stack '()) (total 0))
        (cond
          ((and (atom? t) (null? stack)) (add1 total))
          ((atom? t) (loop (car stack) (cdr stack) (add1 total)))
          (else (loop (cadr t) (append (cddr t) stack) (add1 total))))))
    (define (flatten tree)
      (let loop ((t tree) (stack '()) (l '()))
        (cond
          ((and (atom? t) (null? stack)) (reverse (cons t l)))
          ((atom? t) (loop (car stack) (cdr stack) (cons t l)))
          (else (loop (cadr t) (append (cddr t) stack) (cons (car t) l))))))