如何从方案中的列表中删除元素

时间:2009-12-15 04:46:45

标签: scheme

如何从列表中删除元素 例如: - list = [1 2 3 4]

我想出了一些代码。我想我错了。

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

5 个答案:

答案 0 :(得分: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)))))))

答案 1 :(得分:3)

Shido Takafumi写了一篇关于Scheme 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

答案 2 :(得分: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)))
))

答案 3 :(得分:0)

此代码似乎工作正常,但只删除应该在列表中的元素:

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

答案 4 :(得分:-3)

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