Scheme 正在寻找一个典型的树递归转换为尾部递归形式的示例

Scheme 正在寻找一个典型的树递归转换为尾部递归形式的示例,scheme,tail-recursion,Scheme,Tail Recursion,在嵌套列表上执行任何类似于展平、计数原子等的操作都可以 顺便说一句,我对CPS转换或“成对树”不感兴趣。您可以编写一个带有堆栈的循环,该堆栈记录下一个要处理的树。你还需要一个累加器。但这和CPS并没有什么不同,所以它可能不是你想要的 (define (atom? x) (not (pair? x))) (define (size tree) (let loop ((t tree) (stack '()) (total 0)) (cond ((and (atom? t

在嵌套列表上执行任何类似于展平、计数原子等的操作都可以


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

您可以编写一个带有堆栈的循环,该堆栈记录下一个要处理的树。你还需要一个累加器。但这和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))))))

您只需编写一个带有堆栈的循环,该堆栈记录下一个要处理的树。你还需要一个累加器。但这和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))))))

这正是我想要的,这正是我想要的。