Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 方案-追加到列表的末尾_List_Append_Scheme_Lisp - Fatal编程技术网

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,它只需要一个列表作为它的第二个参数以及第一个参数,将这两个列表附加在一起。所以在不改变函数定义的情况下,你可以改变你使用它的方式。这有很多。