2009-12-15 39 views
3

如何從列表中刪除元素 例如: - 列表= [1 2 3 4]如何從列表中刪除元素方案

我想出了一些code.I認爲我錯了某處。

(define delete item 
    (lambda (list) 
    (cond 
    ((equal?item (car list)) cdr list) 
    (cons(car list)(delete item (cdr list)))))) 

回答

11

你的代碼幾乎是正確的。 的item也應該是一個參數,因此函數可以用這樣的開頭:

(define delete 
    (lambda (item list) 
    ... 

另外,你的代碼需要的最後一個子句中的cdr listelse周圍括號。 然後,代碼可能是這樣的:

(define delete 
    (lambda (item list) 
    (cond 
    ((equal? item (car list)) (cdr list)) 
    (else (cons (car list) (delete item (cdr list))))))) 
+0

嗨圓環 感謝您的更新。刪除如此定義的 – nan 2009-12-15 15:30:46

+0

不是尾遞歸。 它也可以通過摺疊/過濾器來定義。 – Rhangaun 2010-04-20 05:12:35

+1

通過此過程,如果元素出現多次,它只會刪除第一個元素。可以有一個過程刪除列表中的所有相同元素。 – 2012-10-10 02:28:25

-3
(define (deleteItem(list item)) 
    (cond 
    ((eq ? item (car(list)))cdr(list)) 
    (cons(car(list)(deleteItem(cdr list))) 
    ) 
) 
+1

沒有幫助:代碼在某種意義上更糟糕。 – dyoo 2011-11-30 22:08:16

3

至道孝文寫了一篇關於計劃,Yet Another Scheme Tutorial教程。 在chapter 7,練習1,第3題。

採用一個列表(LS)和對象(X)作爲參數,並返回 列表從LS除去X的函數。

作者給出瞭解決方案代碼的頁面底部。

; 3 
(define (remove x ls) 
    (if (null? ls) 
     '() 
     (let ((h (car ls))) 
     ((if (eqv? x h) 
      (lambda (y) y) 
      (lambda (y) (cons h y))) 
     (remove x (cdr ls)))))) 

該代碼可能難以理解的初學者。 與下面的代碼一樣。

(define (rm x ls) 
    (if (null? ls) 
     '() 
     (if (eqv? x (car ls)) 
      (rm x (cdr ls)) 
      (cons (car ls) 
       (rm x (cdr ls)))))) 

這可以刪除列表中的相同元素。 :d

1

1)如果考慮輸入列表可以是一個簡單的列表,或者你只是想刪除一個嵌套列表 的頂級例如項目:

delete 2 from (1 2 3 4) will return (1 2 3) 
delete 2 from (1 2 3 (2 3) 3 2 4) will return (1 3 (2 3) 3 4) 

,我們可以見上面的第二個例子,它只是刪除嵌套列表的頂層項目,在內部列表中,我們不會改變它。

此代碼應該是:

(define (deleteitem list1 item) 
(cond 
    ((null? list1) ’()) 
    ((equal? (car list1) item) (deleteItem (cdr list1) item)) 
    (else (cons (car list1) (deleteitem (cdr list1) item))) 
)) 

2)如果考慮輸入列表可以是嵌套列表

例如:

input list: (1 2 3 (3 2 (2 4 (2 5 6) 2 5 6) 2 4) 2 3 (2 3 4)) 

和在輸入刪除元件2列表

the output list should be: (1 3 (3 (3 (5 6) 5 6) 4) 3 (3 4)) 

和代碼應該是:

(define (delete2 list1 item) 
    (cond 
    ((null? list1) '()) 
    ((pair? (car list1)) (con (delete2 (car list1) item) (delete2 (cdr list1) item))) 
    ((equal? (car list1) item) (delete2 (cdr list1) item)) 
    (else (cons (car list1) (delete2 (cdr list1) item))) 
)) 
0

此代碼似乎工作得很好,但只刪除,應在列表中的一個元素:

(define (delete element lst) 
    (let loop ([temp lst]) 
     (if (= element (car temp)) (cdr temp) 
      (cons (car temp) (loop (cdr temp))))))