从方案列表中删除项目

时间:2012-05-06 04:40:23

标签: scheme racket

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

考虑以下伪代码

define remover
(list = cdr list))

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

3 个答案:

答案 0 :(得分:1)

你钉了它,只是把它写成一个程序:

(define (remover lst)
  (cdr l))

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

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

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

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

在任何情况下,请注意不会修改作为参数传递给remover的原始列表,而是在没有新列表 >旧名单;这是对不可变链表进行操作的方法,你绝不能假设列表上的任何修改都会就地发生。

答案 1 :(得分:1)

小心!

本身没有列表数据结构。因此,您无法获取列表l,并删除l的第一个元素。

当给出列表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将生成一个省略第一个元素的新列表。

答案 2 :(得分:0)

考虑一下cdr的作用。请记住,cdr会返回一个列表。您的答案很接近,您只需要根据Scheme语法和函数来考虑它。

相关问题