如何通过删除第一项来更新列表?
考虑以下伪代码
define remover
(list = cdr list))
还是有更值得推荐的方法来删除列表中的第一项?
答案 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语法和函数来考虑它。