【问题标题】:Scheme, how do you append a list with a single item?方案,你如何附加一个带有单个项目的列表?
【发布时间】:2014-04-09 05:02:49
【问题描述】:

我正在尝试创建一个函数来附加一个包含单个项目的列表。它正在做的是返回一个点对。

(define (append lst x)
  (cond
    ((null? lst) x)
    (else (cons (car lst) (append (cdr lst) x)))))

我得到的输出是

> (append '(1 2 3 4 5 6 7) 8)
(1 2 3 4 5 6 7 . 8)

我正在努力

(1 2 3 4 5 6 7 8)

谢谢。

【问题讨论】:

    标签: scheme racket


    【解决方案1】:

    试试这个:

    (define (append lst x)
      (cond
        ((null? lst) (cons x '())) ; here's the change
        (else (cons (car lst) (append (cdr lst) x)))))
    

    请注意,所有正确的列表都必须以空列表结尾,否则会发生您刚刚经历的情况。换一种说法:

    (cons 1 (cons 2 3))
    => '(1 2 . 3) ; an improper list
    
    (cons 1 (cons 2 (cons 3 '())))
    => '(1 2 3)   ; a proper list
    

    【讨论】:

      【解决方案2】:

      如果您被允许使用append,那么没有理由不这样做。它的执行与您尝试的几乎相同,因为 append 是 O(n) 其中 n 是第一个列表中的元素数。这只是更少的代码。

      ;; append element to last
      (define (append-elt lst x)
        (append lst (list x)))
      

      【讨论】:

      • 可能不允许 - 这可能是 CS 作业,重点是学习如何实现附加(并且可能需要使用未定义附加的 DrScheme/DrRacket 子语言)。
      • @AndrewMedico 我觉得这是不允许的,但我认为它属于对问题的回答。
      • 我见过有人将其命名为 snoc,即颠倒的 cons。 [至于作业,如果有人不承认他们的问题,硬豆。你的回答很好。]
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 2021-03-17
      • 2016-02-23
      • 1970-01-01
      • 2020-01-01
      • 2017-12-19
      • 2021-12-01
      相关资源
      最近更新 更多