如何确保不打印空列表(Scheme)?

时间:2012-12-21 20:44:43

标签: scheme

我有这段代码:

(define graph `(A (B (C)) (D (E)) (C (E))))

(define (prog1 graph)
    (let ([seen `()])
      (define (sub g)
          (cond 
              [(member (car g) seen) `()]
              [else 
               (set! seen (cons (car g) seen))
               (cond
                 [(null? (cdr g)) (list (car g))]
                 [else
                  (cons (car g) (map sub (cdr g)))])])) 
    (sub graph)))

它打印一个连接图,其中所有节点都出现一次。但是,如果已经访问过某个节点,则返回空列表`()。这会导致输出问题,我不知道如何解决它:

运行时(prog1 graph)当前输出为:(A (B (C)) (D (E)) ())

但是,我希望输出为(A (B (C)) (D (E)))

有关如何修改代码以实现此目的的任何提示都会很棒。

1 个答案:

答案 0 :(得分:1)

如果空列表仅出现在列表的最顶层,则可以将其过滤掉。用以下步骤替换过程中的最后一行:

(filter (negate null?) (sub graph))

或者只是这个:

(remove '() (sub graph))

如果空列表出现在任何嵌套级别,您可以在遍历的每一步中递归地应用相同的想法(过滤掉空列表)。