Recursion Scheme中的前序表示法

Recursion Scheme中的前序表示法,recursion,scheme,binary-tree,binary-search-tree,preorder,Recursion,Scheme,Binary Tree,Binary Search Tree,Preorder,假设我的“map diff”函数对以下代码正常工作。我想知道如何获取一个算术解析树,并以预序表示法输出它。我希望能够在我的“preorder”函数中使用我的“map diff”函数,但我不知道如何去做。我这里的基本情况正确吗 (define (make-tree value left right) (list value left right)) (define (value tree) (car tree)) (define (left tree) (cadr tree)) (define

假设我的“map diff”函数对以下代码正常工作。我想知道如何获取一个算术解析树,并以预序表示法输出它。我希望能够在我的“preorder”函数中使用我的“map diff”函数,但我不知道如何去做。我这里的基本情况正确吗

(define (make-tree value left right) (list value left right)) 
(define (value tree) (car tree))
(define (left tree) (cadr tree))
(define (right tree) (caddr tree))

(define (prepare x)
  (cond ((number? x) (number->string x))
        ((char? x) (string x))))

(define x
  (map-diff (lambda (x) (prepare x)) 
    (list #\+ 
      (list #\*
         (list 3 '() '())
         (list 9 '() '()))
      (list #\+
         (list #\/ (list 5 '() '()) '())
         (list 4 '() '())))))


(define (preorder T)
  (cond ((null? T) "")
       ((eq? (value T) "+")
         (cons (value T) (cons (preorder (left T)) (preorder (right T)))))
       ((eq? (value T) "*")
        (cons (value T) (cons (preorder (left T)) (preorder (right T)))))
       ((eq? (value T) "-")
         (cons "-" (preorder (left T))))
       ((eq? (value T) "/")
         (cons "/" (preorder (left T))))
       (else (value T))))

(preorder x)

首先,不要把你的ADT和灵长类混合在一起。如果你定义了一个ADT,那么在考虑程序的情况下坚持使用它<代码>X应根据
生成树
而不是
列表
进行定义。和
make tree
而不是
preorder
中的cons。按照现在的方式,您将得到一个虚线列表作为输出,而不是一个合适的列表形式

考虑到lisps动态类型,我不确定您试图用prepare做什么,将东西转换为字符串来解析它们是相当不寻常的

无论如何,这里有一种可能性

(define (preorder T)
 (let ((top (prepare (value T))))
  (cond ((null? T) "")
        ((eq? top "+")
         (cons top (cons (preorder (left T)) (preorder (right T)))))
        ((eq? top "*")
         (cons top (cons (preorder (left T)) (preorder (right T)))))
        ((eq? top "-")
         (cons "-" (preorder (left T))))
        ((eq? top "/")
         (cons "/" (preorder (left T))))
        (else top)))

首先,不要把你的ADT和灵长类混合在一起。如果你定义了一个ADT,那么在考虑程序的情况下坚持使用它<代码>X应根据
生成树
而不是
列表
进行定义。和
make tree
而不是
preorder
中的cons。按照现在的方式,您将得到一个虚线列表作为输出,而不是一个合适的列表形式

考虑到lisps动态类型,我不确定您试图用prepare做什么,将东西转换为字符串来解析它们是相当不寻常的

无论如何,这里有一种可能性

(define (preorder T)
 (let ((top (prepare (value T))))
  (cond ((null? T) "")
        ((eq? top "+")
         (cons top (cons (preorder (left T)) (preorder (right T)))))
        ((eq? top "*")
         (cons top (cons (preorder (left T)) (preorder (right T)))))
        ((eq? top "-")
         (cons "-" (preorder (left T))))
        ((eq? top "/")
         (cons "/" (preorder (left T))))
        (else top)))

map diff
的第二个参数如何不是“preorder”?你是说你的目标是反转
prepare
map diff
?我试图访问每个节点,然后用前缀表示法生成一个表达式。请将你想要的输出添加到你的问题中。
map diff
的第二个参数如何不是“preorder”?您是说您的目标是反向
准备
映射差异
?我正在尝试访问每个节点,然后生成前缀表示法的表达式。请在您的问题中添加所需的输出。