【问题标题】:relation between foldr and append in SchemeScheme中foldr和append的关系
【发布时间】:2014-05-15 19:46:57
【问题描述】:

尝试弄清楚如何在 Scheme 中使用“append” 我可以像这样找到附加的概念:

-----第1部分:理解Scheme中append的概念-----

1) append 接受两个或更多列表,并用它们的所有元素构造一个新列表。

2) append 要求它的参数是列表,并创建一个列表,其元素是这些列表的元素。它连接给出的列表。 (它有效地将其他列表的元素合并到最后一个列表以创建结果列表。)

3) 它只连接顶层结构 ==> [Q1] “只连接顶层”是什么意思?

4) 但是——它不会“扁平化”嵌套结构。 ==> [Q2] 什么是“扁平化”? (我看到很多地方都这样“变平”,但我还没弄清楚) ==> [Q3] 为什么 append 不会“展平”嵌套结构。

--------- 第 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).... 缺点(acc 元素).....

[Q4] 为什么它必须在代码 1 中“追加”???是不是跟 foldr 有关系??

再次,很抱歉这个问题很长,但我认为这都是相关的。

【问题讨论】:

    标签: scheme append fold


    【解决方案1】:

    Q1/2/3:这个“扁平化”的东西是什么?

    Scheme/Lisp/Racket 使列表非常容易使用。列表易于构建且易于操作。因此,它们通常是嵌套的。所以,例如

    `(a b 34)
    

    表示三个元素的列表:两个符号和一个数字。然而,

    `(a (b c) 34)
    

    表示由三个元素组成的列表:符号、列表和数字。

    “展平”一词用于指转折的操作

    `(3 ((b) c) (d (e f)))
    

    进入

    `(3 b c d e f)
    

    也就是说,列表中的列表是“扁平的”。

    “追加”功能不会展平列表;它只是结合了它们。所以,例如,

    (append `(3 (b c) d) `(a (9)))
    

    会产生

    `(3 (b c) d a (9))
    

    另一种说法是:如果将“追加”应用于长度为 3 的列表和长度为 2 的列表,则结果的长度将为 5。

    Q4/5:Foldl 真的与 append 无关。如果我是你,我想我会问一个关于 foldl 的单独问题。

    最后的建议:去看看 htdp.org。

    【讨论】:

      【解决方案2】:

      Q1:表示不递归追加子列表,只连接最顶层的元素,例如:

      (append '((1) (2)) '((3) (4)))
      => '((1) (2) (3) (4))
      

      Q2:与上一个问题相关,flattening 一个列表摆脱了子列表:

      (flatten '((1) (2) (3) (4)))
      => '(1 2 3 4)
      

      Q3:按照设计,因为append 只连接两个列表,所以为了展平嵌套结构,请使用flatten。

      Q4:在提出此类问题之前,请阅读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)
      

      Q5:不,cons 在这里可以正常工作。如果您只是简单地测试每个程序以了解它们是如何工作的,那么您就不会问这些了。请了解通过阅读文档和编写小示例来了解您在使用什么,这是您学习编程的唯一方法。

      【讨论】:

      • 感谢您的建议。是的,这是真的。我可以自己弄清楚Q5。 (所以我删除了那部分)和关于文档,我在提问之前也阅读了链接的站点(文档中的解释非常抽象..至少,我觉得)..所以,当涉及到逐个案例..与其他编程语言相比,Scheme 非常不同。我认为,这就是为什么它被归类为不同的范式。尽管如此,仍然是的,这是真的。对于 Scheme 程序员来说,这可能是非常基础的。在问其他问题之前,我会花更多时间。
      • @user1915570 好的,没问题,重要的是要正确掌握基本概念,随着您的进步,事情就会水到渠成。我的建议:玩弄这些程序,直到您对它们的作用有所了解,用不同的输入测试它们并查看输出,并始终首先参考文档
      • @user1915570 如果这个答案有帮助,请不要忘记点击左侧的复选标记accept ;)
      猜你喜欢
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      • 2015-01-11
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多