List 如何从列表中删除第一个元素?

List 如何从列表中删除第一个元素?,list,scheme,List,Scheme,在Scheme中,如何从列表中删除第一个元素 假设我有下面的清单 '((apple bob car) (cat dig) (e))) 我怎样才能摆脱苹果而不去管其他的呢?Scheme中的三个基本列表操作是 cdr,意思是“休息”或“给我列表,不带第一项” car,意思是“第一个”或“给我列表中的第一项” cons,表示附加列表 假设s是列表((apple-bob-car)(cat-dig)(e)) 中间步骤 (car s) ; (apple bob car) (cdr (car

在Scheme中,如何从列表中删除第一个元素

假设我有下面的清单

'((apple bob car) (cat dig) (e)))

我怎样才能摆脱苹果而不去管其他的呢?

Scheme中的三个基本列表操作是

  • cdr
    ,意思是“休息”或“给我列表,不带第一项”
  • car
    ,意思是“第一个”或“给我列表中的第一项”
  • cons
    ,表示附加列表
假设s是列表((apple-bob-car)(cat-dig)(e))

中间步骤

(car s)       ; (apple bob car)
(cdr (car s)) ; (bob car)
(cdr s)       ; ((cat dig) (e))
最后的表达

(cons (cdr (car s))) (cdr s))
结果

((bob car) (cat dig) (e))

首先,认识到你的问题有点前后矛盾。如果要删除列表中的第一个元素,则只剩下

((cat dig) (e))
因为列表中的第一个元素是
(apple bob car)

如果你只是想摆脱苹果,那么如果列表的头(车)本身就是一个列表,你就想用它的cdr来代替它。我假设,不管列表的深度如何,您都希望它能够工作,因此您需要递归的方法(与其他答案不同)

因此,如果第一项是一个列表,那么您需要从列表中删除第一项,并递归地将其添加到列表的其余部分。这似乎有效:

(define removeFirst
  (lambda (input)
    (cond
      ((list? (car input)) (cons (removeFirst (car input)) (cdr input)))
      (else (cdr input))
    )
  )
)

> (removeFirst '((apple bob car) (cat dig) (e)))
((bob car) (cat dig) (e))
(cdr x)
(其中“x”是一个列表)将提供除第一个元素之外的所有列表。将它应用于上面的内容的问题是,
apple
不是:
((apple-bob-car)(cat-dig)(e))的第一个元素。您给出的是一个列表列表,外部列表的第一个元素是列表
(apple bob car)


要仅删除“苹果”,您需要确定您收到的列表中的第一个项目本身是否为列表,如果是,则将该列表与删除的第一个项目(提示:递归)组成一个列表,然后是原始列表的其余部分。如果第一项不是列表,那么您只需返回列表的其余部分。

除了其他答案之外,您的问题还有一种变异的味道,Scheme中的列表通常是不可变的——即使是列表中的列表。这就是为什么所有其他答案都返回了一个新的列表,其中没有您想要删除的元素。您可以将列表分配给变量,然后使用set将不同的列表分配给同一变量!但你永远不会改变你第一次列的清单