【问题标题】:How to delete an element from a list in scheme如何从方案中的列表中删除元素
【发布时间】:2009-12-15 04:46:44
【问题描述】:

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

我想出了一些代码。我想我在某个地方弄错了。

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

【问题讨论】:

    标签: scheme


    【解决方案1】:

    您的代码几乎是正确的。 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)))))))
    

    【讨论】:

    • delete 这样定义不是尾递归的。也可以通过 fold/filter 定义。
    • 使用这个过程,如果元素出现不止一次,它只是删除第一个。可以有一个删除列表中所有相同元素的过程。
    • (define (delete item list) (filter (lambda (x) (not (equal? x item))) list))
    【解决方案2】:

    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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        这段代码似乎工作得很好,但只删除了一个应该在列表中的元素:

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

        【讨论】:

          【解决方案5】:
          (define (deleteItem(list item))
              (cond
              ((eq ? item (car(list)))cdr(list))
              (cons(car(list)(deleteItem(cdr list)))
              )
          )
          

          【讨论】:

            猜你喜欢
            • 2012-11-14
            • 2021-03-10
            • 2010-10-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-20
            相关资源
            最近更新 更多