1

您将如何通过删除第一项来更新列表?

考虑以下伪代码

define remover
(list = cdr list))

还是有更推荐的方法来删除列表中的第一项?

4

3 回答 3

1

你搞定了,把它写成一个过程:

(define (remover lst)
  (cdr l))

并像这样使用它(这会创建一个新的绑定,而不是一个赋值):

(let ((new-list (remover old-list)))
  new-list)

或者像这样(这定义了一个新列表):

(define new-list (remover old-list))

在任何情况下,请注意作为参数传递给的原始列表remover不会被修改,而是会返回一个没有旧列表第一个元素的列表;这是对不可变链表进行操作的方式,您永远不应该假设对列表的任何修改都会就地发生。

于 2012-05-06T04:52:57.257 回答
1

谨防!

本身没有列表数据结构。所以你不能拿一个列表l,,并删除第一个元素l

当给定一个 list 时l,您可以做的是用于cdr生成一个新列表,该列表具有相同的元素l,除了新列表不包含第一个元素。

更详细一点:包含三个值 1、2 和 3 的列表表示为 (cons 1 (cons 2 (cons 3 '()))。让我们命名 cons-cells:

       c3 = (cons 3 '()) 
       c2 = (cons 2 c3)
   l = c1 = (cons 1 c2)

首先要注意的是整个列表由值 c1 给出。我们不能通过操作 cons-cell c1 从列表中删除数字 1。然而,我们可以很容易地找到一个省略第一个元素的列表,因为

   c2 = (cons 2 c3) = (cons 2 (cons 3 '())

因此(cdr l) = (cdr c1) = c2将生成一个省略第一个元素的新列表。

于 2012-05-06T08:35:28.243 回答
0

想想做什么cdr。记住,cdr返回一个列表。您的答案很接近,您只需要根据 Scheme 语法和功能来考虑它。

于 2012-05-06T04:51:59.297 回答