2012-05-06 209 views
1

如何通过删除第一项来更新列表?从方案列表中删除项目

考虑以下伪

define remover 
(list = cdr list)) 

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

+0

你走在正确的轨道上,你只需要用正确的Scheme语法重新构思你的想法。 –

+0

我可以通过做 (let list(cdr list))来实现吗? – Ceelos

+0

不完全是,'let'形式不是赋值,而是从'let'形式开始到结尾存在的名称的新绑定。 –

回答

1

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

(define (remover lst) 
    (cdr l)) 

而且使用这样的(这将创建一个新的绑定,并不是分配):

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

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

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

在任何情况下,请注意th在原始列表中作为参数传递给remover将不会被修改,而是一个新列表将返回而不包含旧列表的第一个元素;这是在不可变链接列表上进行操作的方式,您绝对不应该认为列表中的任何修改都会在原地发生。

0

想想cdr是做什么的。请记住,cdr返回一个列表。你的答案很接近,你只需要根据Scheme语法和函数来思考它。

1

当心!

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

你可以做什么,给定一个列表l时,就是用cdr以产生具有相同的元素l一个新的名单呢,除了新的列表不成立的第一要素。

更详细一点:包含三个值1,2和3的列表被表示为(cons 1 (cons 2 (cons 3 '()))。 让我们命名利弊细胞:

 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将产生一个新的清单中移除的第一个元素。