尝试弄清楚如何在Scheme中使用“append” 追加的概念我可以这样找到:
-----第1部分:理解Scheme中的追加概念-----
1)append需要两个或多个列表,并构建一个包含所有元素的新列表。
2)append要求其参数是列表,并生成一个列表,其元素是这些列表的元素。它连接它给出的列表。 (它有效地将其他列表的元素汇集到最后一个列表中以创建结果列表。)
3)它只连接顶级结构==> [Q1]它是什么意思“只连接顶级”?
4)然而 - 它并没有“展平”嵌套结构。 ==> [Q2]什么是“扁平”? (我看到许多地方“扁平化”但我还没弄明白) ==> [Q3]为什么追加不会“压扁”嵌套结构。
----------第2部分:如何在Scheme中使用append ---------------------------- ----
然后我环顾四周尝试使用“追加”,我看到了other discussion基于其他讨论,我尝试了这个实现
[code 1]
(define (tst-foldr-append lst)
(foldr
(lambda (element acc) (append acc (list element)))
lst
'())
)
它有效,但我很难理解这部分...(追加acc(列表元素)......
究竟“追加”在代码1中做了什么,对我来说,它只是翻转。 然后为什么它不能用于其他逻辑,例如 i)只需翻转或 iii).... cons(acc元素).....
[Q4]为什么它必须在代码1中“追加”?那是因为与foldr有关吗?
再次,抱歉这个长期的问题,但我认为这一切都是相关的。
答案 0 :(得分:2)
Scheme / Lisp / Racket使列表非常容易使用。列表易于构建且易于操作。因此,它们通常是嵌套的。所以,例如
`(a b 34)
表示三个元素的列表:两个符号和一个数字。然而,
`(a (b c) 34)
表示三个元素的列表:符号,列表和数字。
" flatten"用于指代转动的操作
`(3 ((b) c) (d (e f)))
到
`(3 b c d e f)
也就是说,列表中的列表是"展平"。
&#39>追加'功能不会压缩列表;它只是结合了它们。所以,例如,
(append `(3 (b c) d) `(a (9)))
会产生
`(3 (b c) d a (9))
另一种说法是:如果你申请'追加'对于长度为3的列表和长度为2的列表,结果的长度为5。
Q4 / 5:Foldl与追加无关。如果我是你,我想我会问一个关于foldl
的单独问题。
最后的建议:去看看htdp.org。
答案 1 :(得分:1)
Q1:这意味着不会递归附加子列表,只会连接最顶层的元素,例如:
(append '((1) (2)) '((3) (4)))
=> '((1) (2) (3) (4))
Q2:与上一个问题相关,展平列表摆脱了子列表:
(flatten '((1) (2) (3) (4)))
=> '(1 2 3 4)
问题3:根据设计,因为append
仅连接两个列表,所以对于展平嵌套结构,请使用flatten
。
问题4:在提出此类问题之前,请先阅读documentation。 append
只是一个不同的程序,不一定与foldr
相关,但它们可以一起使用;它将列表与元素连接起来(如果“元素”是列表,则结果将是正确的列表)。 cons
只是将两个东西粘在一起,无论它们的类型如何,append
总是返回一个列表(正确或不正确)作为输出。例如,要在末尾附加一个元素,您可以执行以下操作:
(append '(1 2) '(3))
=> '(1 2 3)
但是这些表达式会给出不同的结果(在Racket中测试):
(append '(1 2) 3)
=> '(1 2 . 3)
(cons '(1 2) '(3))
=> '((1 2) 3)
(cons '(1 2) 3)
=> '((1 2) . 3)
问题5:不,cons
在这里可行。如果你只是测试每个程序以查看它们是如何工作的,那么你就不会问这些。请通过阅读文档和编写小例子来了解您正在使用的内容,这是您学习如何编程的唯一方法。