我有这段代码:
(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)))
有关如何修改代码以实现此目的的任何提示都会很棒。
答案 0 :(得分:1)
如果空列表仅出现在列表的最顶层,则可以将其过滤掉。用以下步骤替换过程中的最后一行:
(filter (negate null?) (sub graph))
或者只是这个:
(remove '() (sub graph))
如果空列表出现在任何嵌套级别,您可以在遍历的每一步中递归地应用相同的想法(过滤掉空列表)。