2012-12-21 42 views
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)))

任何暗示關於如何修改代碼來實現這一點會很好。

+0

''()'出現在輸出中,因爲你混合了'cons'和'map'。考慮'(sub(A A A))'發生了什麼。還有什麼應該發生在'(sub(A(A(B))))??你的代碼被寫入輸出的方式可能只是'(A)'。 –

回答

1

如果空列表只出現在列表的最頂層,您可以將其過濾掉。在你的程序中使用這個替換最後一行:

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

或者簡單:

(remove '() (sub graph)) 

如果空列表會出現在任何嵌套級別,您可以應用同樣的想法(過濾掉空列表)遞歸地,在遍歷的每一步。