【问题标题】:Adding an element to the end of a list in Scheme在 Scheme 中将元素添加到列表的末尾
【发布时间】:2019-05-14 04:27:20
【问题描述】:

任务是将a 添加到(b c) 的末尾以生成(b c a)

到目前为止,当我尝试

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

我收到(a b c)

但是当我这样做时

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

我收到((b c) . a)

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

【问题讨论】:

  • 试试(append '(b c) (list 'a))

标签: list append scheme


【解决方案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) 方法)。

【讨论】:

  • @glockm15 琐事:这也称为snoccons 的反面)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 2019-04-06
  • 1970-01-01
  • 2013-02-14
相关资源
最近更新 更多