List 方案-追加到列表的末尾
我很抱歉问这么简单的问题。这太微不足道了,我还没能在网上找到有这个问题的人。所以我非常感谢你的帮助 我想写一个非常简单的函数,它接受一个列表和一个项目,并将该项目附加到列表的末尾 我递归编写的函数到达列表的末尾并返回新项。这不起作用,真令人沮丧。这是我见过的最简单的函数List 方案-追加到列表的末尾,list,append,scheme,lisp,List,Append,Scheme,Lisp,我很抱歉问这么简单的问题。这太微不足道了,我还没能在网上找到有这个问题的人。所以我非常感谢你的帮助 我想写一个非常简单的函数,它接受一个列表和一个项目,并将该项目附加到列表的末尾 我递归编写的函数到达列表的末尾并返回新项。这不起作用,真令人沮丧。这是我见过的最简单的函数 (define (my-append lst item) (if (null? lst) item (cons (car lst) (my-append (cdr lst) item)))) (displa
(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)
我真的非常感谢你的帮助,因为我对此非常失望。如果有帮助的话,我将使用在线编译器运行此代码
您只需要以列表而不是项结束递归。与此相反:
(if (null? lst)
item
这样做:
(if (null? lst)
(list item)
要澄清-方案中的列表必须以空列表结尾”()
。如果您的递归以一个项结束,那么最终会得到如下结果:
(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)))
之所以存在
,是因为结果列表中的最后一对没有指向空列表的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)
的原因相同
编写递归函数时,需要考虑以下方法:
(my-append '() 5)
这应该返回(5)
,对吗?但是您的函数将只返回5
。这意味着您需要将项
包装在基本大小写的列表中
(define (my-append lst item)
(if (null? lst)
(list item)
(cons (car lst) (my-append (cdr lst) item))))
请注意,内置的
append
过程用于附加两个列表,而不是附加一个列表和一个项目。您的函数是定义该函数的正确方法。这很有效!非常感谢你。我不知道为什么我必须以(列表项)结束它。在我看来,以项目结尾是有道理的。谢谢!你解释得很好。事后来看:)你可以尝试一下,在(我的附加(列表1234)5)
之后,你可以尝试一下,例如(我的附加(列表1234)(列表566))
,然后就可以这样得到这个想法。您可以看到,您的append是一个非常好的普通append,它只需要一个列表作为它的第二个参数以及第一个参数,将这两个列表附加在一起。所以在不改变函数定义的情况下,你可以改变你使用它的方式。这有很多。