【问题标题】:SCHEME remove atomic value from a listSCHEME 从列表中删除原子值
【发布时间】:2014-09-22 00:28:35
【问题描述】:

我需要执行一个发送值的函数,并在列表中检查是否有相等的值以将其删除。以下是一些示例:

(elimina 1 '(a b c))            => (a b c)
(elimina 'b '(a (b) c))         => (a () c)
(elimina 1  '(0 (1 (2) 1) 0))   => (0 ((2)) 0)

我试过了:

(define (elimina v1 lista)
  (cond ((null? lista)'())

        ((list? (first lista))
         (list (elimina v1 (first lista))))

        (else
         (if(equal? v1 (first lista))
           (elimina v1 (cdr lista))
           (append (cons (first lista) (elimina v1 (cdr lista))))))
   )
)

我的结果是这样的:

(elimina 1 '(a b c))         => (a b c)
(elimina 'b '(a (b) c))      => (a ())
(elimina 1  '(0 (1 (2) 1) 0) => (0 ((2)))

由于某种原因,列表中的最后一个值没有显示。希望有人能帮忙。

谢谢!

【问题讨论】:

    标签: list scheme atomic-values


    【解决方案1】:

    1) 你的问题就在这里:

    ((list? (first lista))
             (list (elimina v1 (first lista))))
    

    当您递归到子列表时,您不再处理列表的其余部分。

    2) 还有,

    (append (cons (first lista) (elimina v1 (cdr lista))))))
    

    可以简化,因为您将列表添加到任何内容中,因此只需删除append

    3) 不是错误,但我建议您使用 either first, second, rest ... car, @987654328 @,cdr ...

    试试:

    (define (elimina v1 lista)
      (cond 
        ((null? lista) '())
        ((list? (first lista)) 
         (cons (elimina v1 (first lista)) (elimina v1 (rest lista)))) ; <= (1)
        (else
         (if (equal? v1 (first lista))
             (elimina v1 (rest lista))
             (cons (first lista) (elimina v1 (rest lista)))))))       ; <= (2)
    

    【讨论】:

      猜你喜欢
      • 2014-01-06
      • 2012-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-22
      • 1970-01-01
      相关资源
      最近更新 更多