您将如何通过删除第一项来更新列表?
考虑以下伪代码
define remover
(list = cdr list))
还是有更推荐的方法来删除列表中的第一项?
你搞定了,把它写成一个过程:
(define (remover lst)
(cdr l))
并像这样使用它(这会创建一个新的绑定,而不是一个赋值):
(let ((new-list (remover old-list)))
new-list)
或者像这样(这定义了一个新列表):
(define new-list (remover old-list))
在任何情况下,请注意作为参数传递给的原始列表remover
不会被修改,而是会返回一个没有旧列表第一个元素的新列表;这是对不可变链表进行操作的方式,您永远不应该假设对列表的任何修改都会就地发生。
谨防!
本身没有列表数据结构。所以你不能拿一个列表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
将生成一个省略第一个元素的新列表。
想想做什么cdr
。记住,cdr
返回一个列表。您的答案很接近,您只需要根据 Scheme 语法和功能来考虑它。