如何从scheme中的列表中删除元素

如何从scheme中的列表中删除元素,scheme,Scheme,如何从列表中删除元素 例:-列表=[1 2 3 4] 我想出了一些代码。我想我在什么地方出错了 (define delete item (lambda (list) (cond ((equal?item (car list)) cdr list) (cons(car list)(delete item (cdr list)))))) 你的代码几乎是正确的。 项也应该是一个参数,因此函数可以这样开始: (define delete (lambda (item

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

我想出了一些代码。我想我在什么地方出错了

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

你的代码几乎是正确的。
也应该是一个参数,因此函数可以这样开始:

(define delete
  (lambda (item list)
  ...
(define delete
  (lambda (item list)
    (cond
     ((equal? item (car list)) (cdr list))
     (else (cons (car list) (delete item (cdr list)))))))
此外,您的代码需要在最后一个子句中的
cdr列表
else
周围进行排列。 然后,代码可能如下所示:

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

Shido Takafumi写了一篇关于Scheme的教程。 在练习1中,第三个问题

以列表(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))))))
这可以删除列表中的相同元素:如果输入列表可以是一个简单的列表,或者只想删除嵌套列表的顶层中的项 例如:

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

2)如果考虑输入列表可以是嵌套列表< /P> 例如:

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 (deleteitem list1 item) 
( cond
    ((null? list1) ’())
    ((equal? (car list1) item) (deleteItem (cdr list1) item)) 
    (else (cons (car list1) (deleteitem (cdr list1) item)))
))
(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)))
))

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

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

这样定义的delete不是尾部递归的。它也可以通过fold/filter来定义。在这个过程中,如果元素出现多次,它只会删除第一个元素。可以有一个删除列表中所有相同元素的过程。
(定义(删除项目列表)(筛选(lambda(x)(不等于?x项目)))列表))