在Scheme中向列表末尾添加元素

3

任务是在 (b c) 的末尾添加 a,以得到 (b c a)

目前为止,我尝试的方法是

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

我得到了(a b c)

但是当我执行以下操作时

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

我得到了((b c) . a)

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


1
尝试执行(append '(b c) (list 'a)) - Will Ness
1个回答

2
一个列表是一组成对的元素。每个成对元素的第一个元素是car,第二个元素是cdr,它指向链中的下一个成对元素,或者对于链中的最后一个成对元素来说,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)方法)。

最初的回答:


@glockm15 小知识:这也被称为 snoccons 的反转)。 - coredump

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接