附加和缺点球拍之间的区别

时间:2016-01-31 15:09:07

标签: racket

我试图理解cons和append之间的区别在于如何存储列表。考虑这个案例:

(define x '(hi, hello))
(define y '(randomvalue1, randomvalue2))

如果我假设打电话 这两个列表上的(cons x y)将生成一个虚线对 其中第一个指针指向x,第二个指针指向y

总而言之,x或y都没有改变。唯一添加内存的是虚线对。

但是当我用两个列表调用append时:

(append x y)

我认为,为了让球拍避免更改xy,我们必须为x和{{ 1}}按顺序。此列表没有指向yx的任何指针。

我的假设是否正确?

1 个答案:

答案 0 :(得分:2)

我更喜欢使用(list ...)来编写列表,其中(list <a> <b> <c> <d>)(cons <a> (cons <b> (cons <c> (cons <d> empty))))的简写

在提出问题之前,我想提一个问题:

(define x '(hi, hello))
(define y '(randomvalue1, randomvalue2))

将导致:

(list 'hi ',hello)
(list 'randomvalue1 ',randomvalue2)

你的意思是写:

(define x '(hi hello))
(define y '(randomvalue1 randomvalue2))

导致:

(list 'hi 'hello)
(list 'randomvalue1 'randomvalue2)

现在,对于您的问题,这里是append

的实现
(define (append x y)
  (cond
    [(empty? x) y]
    [(cons? x) (cons (first x) (append (rest x) y))]))

直观地,它将x析构为元素并重新排列元素以形成新列表。但是,y在整个函数中保持不变。因此,y结果中(append x y)的内存地址仍然指向与之前相同的y。对于x,它没有。