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

Printing 方案以深度优先的方式遍历和打印DAG,printing,functional-programming,scheme,racket,tree-traversal,Printing,Functional Programming,Scheme,Racket,Tree Traversal,设节点是一个函数,其闭包中有存储。图形的所有叶都有一个单一值(常量或变量)的存储,所有内部节点都有一个包含以下内容的列表存储: 表示函数的符号(“+”*“cos”sin等) 表示此节点的子节点的一个或多个节点的列表 简化函数(与我的问题无关) 假设[[(节点f)]]=[[(f存储)]],如果f是一个过程,而存储是节点闭包中的存储 我正在试图找到一种方法来遍历这棵树,并打印一个可以用(eval)计算的表达式。我已经接近了,但我就是不能让它工作 这是我的密码: (define repr (lam

节点是一个函数,其闭包中有存储。图形的所有叶都有一个单一值(常量或变量)的存储,所有内部节点都有一个包含以下内容的列表存储:

  • 表示函数的符号(“+”*“cos”sin等)
  • 表示此节点的子节点的一个或多个节点的列表
  • 简化函数(与我的问题无关)
  • 假设[[(节点f)]]=[[(f存储)]],如果f是一个过程,而存储是节点闭包中的存储

    我正在试图找到一种方法来遍历这棵树,并打印一个可以用(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个子节点,所有子节点都是叶子)

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

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


    正如您所看到的,问题来自表达式中的额外括号。您可以想象,对于更复杂的示例,情况更糟。我知道我在哪里创建列表以及为什么会有括号,但我似乎找不到删除它的方法,无法正确打印值。

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

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

    我们只需要在
    repr\u helper
    返回的列表的最前面添加一个新项目,调用
    cons
    就可以了。

    我们无法重现这个问题。您是如何拨打
    repr
    ?请发布所有缺少的信息:
    是_leaf?
    过程,产生错误输出的
    存储
    对象,以及所有其他过程,以便我们可以执行代码。一个好问题的期望是,任何人都可以复制、粘贴和执行问题中的代码,并收到与您报告的错误相同的错误。代码有点长,所以我认为发布所有代码是一个坏主意。我将尝试做一个简单的例子,但简单地打印列表的内容对我来说就足够了@ÓscarLópezSorry,不可能回答你的问题。我将尝试猜测,但这是任何人都能帮助的,没有一个适当的工作示例。尝试用以下内容替换
    repr
    中的最后两行:
    (附加(列表(汽车商店))(repr\u助手(汽车商店)repr))
    。如果这不起作用,那么祝你好运。我正要粘贴代码,但这确实起作用。我将尝试对其进行解码,但从外观上看,它似乎将助手创建的列表附加到原始列表中。还可以正确地获取订单。我觉得自己有点傻,没想到那一点。非常欢迎你把它输入我会接受的答案中。谢谢@ÓscarLópezmy bad,有一个更简单更明显的方法来解决你的问题,我更新了我的答案。
    (define repr
      (lambda (store)
        (if (is_leaf? store)
            store
            (cons (car store)
                  (repr_helper (cadr store) repr)))))