【问题标题】:Scheme - Appending to the end of a list方案 - 附加到列表的末尾
【发布时间】:2019-06-28 22:45:40
【问题描述】:

对于这么简单的问题,我感到非常抱歉。太琐碎了,我一直无法在网上找到有这个问题的人。因此,我将不胜感激。

我想编写一个非常简单的函数,它接受一个列表和一个项目,并将该项目附加到列表的末尾。

我编写的函数递归到列表的末尾并返回新项目。令人沮丧的是,这不起作用。这是我见过的最简单的函数

(define (my-append lst item)
  (if (null? lst)
    item
    (cons (car lst) (my-append (cdr lst) item))))

(display (my-append (list 1 2 3 4) 5))

这显示

(1 2 3 4 . 5) 

我不知道为什么会有那个点,这非常令人沮丧。我在以前的任何 SO 问题中都没有遇到过。

我只是想看看

(1 2 3 4 5)

我真的很感激一些帮助,因为我对此感到非常沮丧。如果有帮助,我正在使用在线编译器运行此代码 https://repl.it/languages/scheme

【问题讨论】:

  • 事后看来:)你可以尝试一下,在(my-append (list 1 2 3 4) 5)之后你可以尝试例如(my-append (list 1 2 3 4) (list 5 6)) 并以这种方式获得想法。所以你看, your-append 是一个非常好的和正常的附加,它只需要一个列表作为它的第二个参数以及第一个参数,将这两个列表附加在一起。所以在不改变函数定义的情况下,你可以改变使用它的方式。
  • 关于这个的previous SO questions很多。

标签: list append scheme lisp


【解决方案1】:

你只需要用一个列表结束递归,而不是一个项目。而不是这个:

(if (null? lst)
    item

这样做:

(if (null? lst)
    (list item)

澄清一下——Scheme 中的列表必须以空列表'() 结尾。如果你的递归以一个项目结束,你最终会得到这样的结果:

(cons 4 5)
=> '(4 . 5)

这是一对cons 。正确的列表以空列表结尾:

(cons 4 (cons 5 '()))
=> '(4 5)

等同于:

(cons 4 (list 5))
=> '(4 5)

顺便说一句,这是在末尾附加项目的惯用方式:

(define (my-append lst item)
  (append lst (list item)))

【讨论】:

  • 成功了!非常感谢。我不知道为什么我必须以 (list item) 结束它。在我看来,以 item 结尾是有道理的。
  • 谢谢!你解释得很好。
【解决方案2】:

. 存在是因为结果列表中的最后一对没有其 cdr 指向空列表。正确的列表是一对链,其中链中的最后一个 cdr 指向一个空列表。例如

(list 1 2 3 4 5)
# is equivalent to
(cons 1 (cons 2 (cons 3 (cons 4 (cons 5 '()))))

但是你创建的列表是

(cons 1 (cons 2 (cons 3 (cons 4 5)))

您会在列表中看到.,原因与(cons 4 5) 打印为(4 . 5) 的原因相同。

在编写递归函数时,需要这样思考:

  1. 输入的基本情况是什么?
  2. 该函数应为该输入返回什么?
  3. 在非基础情况下,如何简化输入以更接近基础?
  4. 如何将递归调用的结果与输入结合起来?

除了第 2 步之外,一切正常。

考虑基本情况:

(my-append '() 5)

这应该返回(5),对吗?但是你的函数只会返回5。这意味着您需要在基本情况下将item 包装在一个列表中。

(define (my-append lst item)
  (if (null? lst)
    (list item)
    (cons (car lst) (my-append (cdr lst) item))))

请注意,内置的append 过程用于附加两个列表,而不是附加一个列表和一个项目。您的函数是定义该函数的正确方法。

【讨论】:

    猜你喜欢
    • 2017-12-19
    • 2012-09-25
    • 2016-06-17
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    相关资源
    最近更新 更多