方案以深度优先的方式遍历并打印DAG

问题描述 投票:0回答:1

NODE是一个在其闭包中带有STORE的函数。图的所有叶子的STORE均为单个值(常量或变量),所有内部节点的STORE均为包含以下内容的列表:

  1. 表示功能的符号('+'*'cos'sin等)
  2. 代表此NODE子级的一个或多个NODES的列表。
  3. 简化功能(与我的问题无关)。>
  4. 假设[[[(NODE f)]] = [[(f STORE)]] >>如果f是一个过程,而STORE是NODE闭包中的STORE。

我试图找到一种遍历这棵树并打印可以用(eval)求值的表达式的方法。我已经接近了,但是我无法使它正常工作。

这是我的代码:

(define repr
  (lambda(store)
    (if (is_leaf? store)
        store
        (list (car store)
              (repr_helper (cadr store) repr)))))

(define repr_helper
  (lambda(f_list arg)
    (cond ((null? f_list) '())
          (else (cons ((car f_list) arg) (repr_helper (cdr f_list) arg))))))

简单的例子:假设一棵树仅添加了4个参数(创建一个带有4个子节点的+节点,所有子节点都是叶子)。

((Add 10 'x 'y 'z) repr)

输出:

'(+(10 x y z))。

预期输出:'(+ 10 x y z)

如您所见,问题来自表达式内多余的括号。您可以想象,对于更复杂的示例,情况甚至更糟。我知道我在哪里创建列表以及为什么有括号,但是我似乎找不到找到将其删除,正确打印值的方法。

让NODE是一个在其关闭时带有STORE的函数。图的所有叶子的STORE均为单个值(常量或变量),所有内部节点的STORE均为列表...

printing functional-programming scheme racket tree-traversal
1个回答
1
投票

尝试修改构建列表的部分,如下所示:

(define repr
  (lambda (store)
    (if (is_leaf? store)
        store
        (cons (car store)
              (repr_helper (cadr store) repr)))))
© www.soinside.com 2019 - 2024. All rights reserved.