在Scheme中将元素添加到列表的末尾

时间:2019-05-14 04:27:21

标签: list append scheme

负责将a添加到(b c)的末尾以制作(b c a)

到目前为止,当我尝试

(print (cons 'a '(b c))) 

我得到(a b c)

但是当我这样做

(print (cons '(b c) 'a)) 

我得到((b c) . a)

Stack上的所有其他类似问题似乎都比这个问题复杂,所以我想知道是否有一个简单的解决方法。

1 个答案:

答案 0 :(得分:1)

列表是成对的链。元素是每对中的汽车,cdr是对链中下一对的引用,或链中最后对的空列表。

使用(cons 'a '(b c))时,会在现有列表(b c)的前面创建一对新配对,因此结果仍然是列表。

但是当您使用(cons '(b c) 'a)时,您正在创建一个cdr为符号a而不是列表的对。并且列表(b c)中的最后一对仍将其cdr指向空列表。

您需要复制第一个列表,到末尾时,必须使cdr指向包含a的列表。您可以使用递归过程来做到这一点。

(define (list-append old-list new-el)
  (if (null? old-list) 
      (list new-el)
      (cons (car old-list) 
            (list-append (cdr old-list) new-el))))
(list-append '(b c) 'a)

逻辑是:

  • 如果我们尝试追加到一个空列表,只需返回一个包含新元素的列表
  • 否则,请使用递归调用将新元素附加到原始列表的末尾,然后将第一个元素放在该元素的前面(使用在第一个示例中显示的(cons new-element old-list)方法)。 / li>