3

我有这个代码:

(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)))

关于如何修改代码以实现这一点的任何提示都会很棒。

4

1 回答 1

1

如果空列表仅出现在列表的最顶层,您可以将它们过滤掉。将过程中的最后一行替换为:

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

或者简单地说:

(remove '() (sub graph))

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

于 2012-12-21T21:04:49.287 回答