从Scheme中的List中删除元素

时间:2013-11-11 18:49:39

标签: list scheme racket

我有此表单的列表

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

我要删除一个项目,让我们说(3 1)

所以结果将是

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

我写过这样的东西,我不知道它为什么运行不正确。

(define (deleteItem list item)
  (cond
    ((equal? item (car  list)) (cdr list))
    (cons (car  list)(deleteItem(cdr list) item))))

3 个答案:

答案 0 :(得分:3)

这里有一个内置函数,它被称为remove

(define lst
  '((1 3) (2 2) (3 1) (4 5) (5 1)))

(remove '(3 1) lst)
=> '((1 3) (2 2) (4 5) (5 1))

...但我想你需要从头开始实施它。您的代码的一些建议:

  • 您不应该使用list作为参数名称,它会与内置函数发生冲突。我们称之为lst而不是
  • 您错过了大多数列表程序所必需的基本案例:如果列表为空,会发生什么?
  • 您还错过了最后一个条件中的else部分

完成上述所有修复后,该过程将起作用:

(define (deleteItem lst item)
  (cond ((null? lst)
         '())
        ((equal? item (car lst))
         (cdr lst))
        (else
         (cons (car lst) 
               (deleteItem (cdr lst) item)))))

(deleteItem lst '(3 1))
=> '((1 3) (2 2) (4 5) (5 1))

答案 1 :(得分:1)

该程序已经存在:

(remove '(3 1) '((1 3) (2 2) (3 1) (4 5) (5 1))))

否则您的程序应如下所示:

(define (deleteItem item list) 
  (cond 
    ((empty? list) '())
    ((equal? item (car list)) (cdr list))
    (else (cons (car list) (deleteItem item (cdr list))))))

你错过了:

  • 基本情况,(空?列表)
  • 最后一句中的“else”

并且您不应该使用 list 作为变量名称,因为它会影响内置过程list(但它会起作用)。

答案 2 :(得分:0)

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)))
))