2011-10-29 81 views
1

例如, 如果輸入是: (列表(列表1)(表2)(表3)) 輸出將是: (列表1 2 3)如何返回列表中的所有元素? (PLT計劃)

爲什麼沒有按」這個代碼工作?

(define (listoutput mylist) 
    (cond 
    [(empty? mylist) empty] 
    [(cons? mylist) (append (list (first list)) (listoutput (rest mylist)))])) 

(check-expect (listoutput (list (list 1) (list 2) (list 3))) 
       (list 1 2 3) 
+0

也許是爲了指出明顯,'入住expect'缺少親密-paren。 – djhaskin987

回答

2

你實際上相當接近。以下是一些可能有所幫助的問題:

listoutput的合同/簽名是什麼?

什麼是append的合同/簽名?

此外,我建議您先構建最簡單的示例,每個示例都建立在以前的示例上。例如,

(check-expect (listoutput empty)) ???) 
(check-expect (listoutput (cons (list 1) empty)) ???) 

如果第一個測試通過,但第二個失敗,是什麼暗示有關問題的根源所在,給出的函數的結構?

0
[(cons? mylist) (append (list (first list)) (listoutput (rest mylist)))])) 

該行有兩個錯誤。最明顯的是它應該是(first mylist)而不是(first list)(儘管我希望你確實知道並錯誤輸入了它)。第二個是(first mylist)返回一個列表(因爲您正在獲取列表的列表),但是在將它傳遞給append之前,將它與list函數一起包裝。因此,在你的例子中,你第一次調用(list 1)append,而不是(list (list 1))。您應該簡單地從該表達式中刪除list函數。

0

你問的flatten程序,試試這個:

(define (flatten lst) 
    (cond ((empty? lst) null) 
     ((not (list? lst)) (list lst)) 
     (else (append (flatten (first lst)) 
         (flatten (rest lst)))))) 

你可以測試一下:

(flatten (list (list 1) (list 2) (list 3))) 
> (1 2 3) 
(flatten '(1 (2 (3)) (4))) 
> (1 2 3 4) 
+0

是否爲樹木鋪平工作,還是有相當的? –

+0

列表列表形成一棵樹,所以你可以這樣說。你爲什麼不給它一個測試? –

相關問題