首页 > 解决方案 > 在 Scheme 中将元素添加到列表的末尾

问题描述

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

到目前为止,当我尝试

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

我明白了(a b c)

但是当我这样做时

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

我明白了((b c) . a)

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

标签: listappendscheme

解决方案


列表是一对链。元素是每对的汽车,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)您在第一个示例中显示的方法)。

推荐阅读