【问题标题】:Scheme add element to the end of list [closed]方案将元素添加到列表末尾[关闭]
【发布时间】:2012-09-25 00:15:44
【问题描述】:

如何将元素添加到列表的末尾(在空之前) 什么时候只有缺点,首先,休息,空?并且可以使用 cond 递归

【问题讨论】:

  • 请注意:如果我们忽略此家庭作业的人为限制,则将元素 E 添加到列表 L 的末尾是:(附加 L(列表 E))。添加到列表的末尾可能会很昂贵,因此如果没有额外的上下文,请求的操作是大多数程序员会避免的,除非问题域需要它,即使那样,普通的普通列表也可能不是正确的数据结构。跨度>

标签: scheme racket


【解决方案1】:

想想你将如何实现append(或者,更一般地,想想你将如何实现右折叠)。现在,如果您将一个列表附加到包含要添加的元素的单例列表中,那么您基本上已经附加了您的元素。

(显然,这是 O(n),所以不要以这种方式单独添加元素。)


这是一个使用右折叠的解决方案:

(define (append-element lst elem)
  (foldr cons (list elem) lst))

以及使用append的解决方案:

(define (append-element lst elem)
  (append lst (list elem)))

因此,如果您可以自己实现foldrappend,使用您列出的操作(很简单!试试吧),您就可以开始了。

附:实际上,您可以使用右折叠实现append

(define (append lst1 lst2)
  (foldr cons lst2 lst1))

但这仍然让您自己实现foldr。 ;-)(提示:这很简单。请查看my implementation of left-fold 以获取开始的想法。)

【讨论】:

    【解决方案2】:

    这看起来像家庭作业,所以我会给你一些指导,让你走上正轨,填空:

    (define (add-last lst ele)
      (cond ((empty? lst)    ; if the list is empty
             <???>)          ; create a one-element list with `ele`
            (else            ; if the list is non-empty
             (cons <???>     ; cons the first element in the list
                   <???>)))) ; with the result of advancing the recursion
    

    以上可以通过consfirstrestempty?cond实现,无需其他程序。

    【讨论】:

    • 我也在学习Scheme,我想问你一些关于你的答案:这个过程会创建一个新列表还是将ele添加到列表lst的末尾?谢谢。
    • 大多数列表过程都会创建一个新列表,除非您在代码中看到类似set-car!set-cdr! 的内容。
    猜你喜欢
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    相关资源
    最近更新 更多