2010-09-18 49 views
0

我試圖寫一個方案,函數,接受了形式的列表:方案列表修改

((#f ((1 1) (2 1))) 
(#f ((1 3) (5 1))) 
(#f ((1 4) (7 1))) 
) 

,並刪除所有#F給像列表:

(((1 1) (2 1)) 
    ((1 3) (5 1)) 
    ((1 4) (7 1)) 
) 

我有試了下面的代碼,但不能得到它的工作:

(define meth 
    (lambda lst 
    (if (equal? (cdr lst) '()) 
     (cdr (car lst)) 
     (cons (list-ref (car lst) 1) (meth (cdr lst)))))) 

有誰知道如何做到這一點?謝謝。

回答

2

您可以使用mapcdr函數應用於列表中的每個子列表,如下所示:(map cdr lst)。然而,這會給你

((((1 1) (2 1))) 
    (((1 3) (5 1))) 
    (((1 4) (7 1))) 
) 

爲您的示例輸入,這是一個嵌套層次超過您的示例輸出。因此,爲了得到你的樣品輸出,使用list-ref讓每個子列表的第二個元素:

(define (meth lst) (map (lambda (x) (list-ref x 1)) lst)) 

編輯:禮Barzilay有益指出,有cadr函數來獲取列表的第二個元素,所以這可以縮短爲:

(define (meth lst) (map cadr lst)) 
+0

注意'cadr'返回第二個元素。 (此外,這是一個很好的答案 - 但問題文本中的「修改」是假的。) – 2010-09-18 21:13:56

2

這是一種方式更緊密地做到這一點你有什麼:

(define meth 
    (lambda (lst) 
    (cond 
     ((null? lst) '()) 
     ((cons (cadr (car lst)) (meth (cdr lst)))) 
    ) 
    ) 
) 


(define a '(
      (#f ((1 1) (2 1))) 
      (#f ((1 3) (5 1))) 
      (#f ((1 4) (7 1))) 
      ))