试着找出如何在Scheme中使用"append"我可以找到这样的附加概念:
-----第1部分:理解Scheme-----
中追加的概念1) append接受两个或多个列表,并使用它们的所有元素构造一个新列表。
2) append要求其参数为列表,并创建一个列表,其元素为这些列表的元素。它将给出的列表连接起来。(它有效地将其他列表中的元素合并到最后一个列表中以创建结果列表。)
3)它只连接顶层结构==> [Q1]"只连接顶层"是什么意思?
4)然而,它不会"平"嵌套结构。==> [Q2]什么是flatten ?(我看到很多地方都是这样"变平"的,但我还没有弄清楚)==> [Q3]为什么append不"平"嵌套结构
---------- 第2部分:如何使用附加的计划 --------------------------------
然后我环顾四周,试图使用"追加",我看到其他讨论
基于其他讨论,我尝试这个实现
[code 1]
(define (tst-foldr-append lst)
(foldr
(lambda (element acc) (append acc (list element)))
lst
'())
)
它工作,但我很难理解这部分…
"append"到底在代码1中做什么,对我来说,它只是翻转。那么为什么不能使用其他逻辑例如:I)只是简单地翻转或3)……Cons (acc element).....
[Q4]为什么必须在代码1中"追加"?这是因为折叠吗?
再次,很抱歉问这么长的问题,但我认为这都是相关的。
Q1/2/3: "扁平化"是什么?
Scheme/Lisp/Racket使得使用列表变得非常非常容易。列表易于构造和操作。因此,它们通常是嵌套的。例如
`(a b 34)
表示包含三个元素的列表:两个符号和一个数字。然而,
`(a (b c) 34)
表示包含三个元素的列表:符号、、列表和数字。
"flatten"一词用来指翻转
的操作。`(3 ((b) c) (d (e f)))
到
`(3 b c d e f)
也就是说,列表中的列表被"平面化"。
'append'函数不会平铺列表;它只是把它们结合起来。例如,
(append `(3 (b c) d) `(a (9)))
会产生
`(3 (b c) d a (9))
另一种说法是:如果你对一个长度为3的列表和一个长度为2的列表应用'append',结果将是长度为5的列表。
Q4/5: Foldl和append真的没什么关系。如果我是你,我想我会问一个关于foldl
的单独问题。
最后的建议:去看看htdp.org
Q1:这意味着子列表不递归地追加,只将最上面的元素连接起来,例如:
(append '((1) (2)) '((3) (4)))
=> '((1) (2) (3) (4))
问题2:与上一个问题相关,扁平化列表可以去掉子列表:
(flatten '((1) (2) (3) (4)))
=> '(1 2 3 4)
Q3:根据设计,因为append
只连接两个列表,为了平坦嵌套结构使用flatten
。
Q4:问这类问题之前请先阅读文档。append
只是一个不同的程序,与foldr
不一定相关,但它们可以一起使用;它将一个列表与一个元素连接起来(如果"元素"是一个列表,结果将是一个正确的列表)。cons
只是把两个东西放在一起,不管它们的类型如何,而append
总是返回一个列表(正确或不正确)作为输出。例如,要在末尾添加一个元素,您可以这样做:
(append '(1 2) '(3))
=> '(1 2 3)
但是这些表达式会给出不同的结果(在球拍中测试):
(append '(1 2) 3)
=> '(1 2 . 3)
(cons '(1 2) '(3))
=> '((1 2) 3)
(cons '(1 2) 3)
=> '((1 2) . 3)
Q5:不,cons
在这里可以正常工作。如果您只是测试每个过程,看看它们是如何工作的,那么您就不会问这些问题了。请通过阅读文档和编写小示例来理解你正在使用的,这是你学习如何编程的唯一途径。