球拍中的树形折叠

2023-12-08

我是 Racket 的初学者,我有这样的问题:

  • 定义一个结构,node,其中包含以下字段:value, left, middle, right。该结构表示树结构中的节点。
    这些字段包含存储在节点、左子树中的值, 分别为中子树和右子树。如果一个子树 不存在,那么对应的字段应该包含emptyNode如下所述。
  • 定义一个结构,emptyNode,指定树中的空节点。
  • 写一个函数,treeFold,它需要一个函数,f,初始值,initial,以及树结构,tree,作为参数。它应该 然后生成一个值,该值是使用的结果f折叠 树中的值(使用left, middle, and right其中的子树 命令)。注意f是一个函数,它需要two参数。首先 参数是树中的一个值,第二个是部分值 累积的结果。

函数调用应该是:

(treeFold (lambda (a acc) (+ a acc)) 15 tree) 

tree:

(node 7 (node 5 (emptyNode) (emptyNode) (emptyNode)) 
        (node 20 (emptyNode) (emptyNode) (emptyNode)) 
        (emptyNode))

输出 :47

这就是我到目前为止所做的:

(struct node (value left middle right) #:transparent)

(struct emptyNode () #:transparent)

(define tree 
    (node 7 
          (node 5 (emptyNode) (emptyNode) (emptyNode)) 
          (node 20 (emptyNode) (emptyNode) (emptyNode)) 
          (emptyNode)))

(define (treeFold f initial tree)
  (if (emptyNode? tree)
     (emptyNode)
     (node (f initial (node-value tree))
           (node-left tree)
           (node-middle tree)
           (node-right tree))))

我怎样才能得到整个叶子的总数?

任何想法或帮助,谢谢


编辑:所以,根据评论中的答案和讨论,我得到了一个新功能,但仍然有一个错误,我找不到它。这里是:

(define (treeFold f initial tree) 
  (cond 
    [(emptyNode? tree) 
          (f initial 0)] 
    [else (f (node-value tree) 
             (f (treeFold f 
                   (treeFold f 
                      (treeFold f initial 
                         (node-left tree)) 
                      (node-middle tree)) 
                    (node-right tree))))]))

你能告诉我如何解决它吗?谢谢。


编辑:最终代码

(define (treeFold f initial tree) 
  (cond 
    [(emptyNode? tree) (f initial 0)] 
    [else (f  (node-value tree)                
              (treeFold f                   
                   (treeFold f 
                        (treeFold f initial 
                             (node-left tree)) 
                             (node-middle tree)) 
                             (node-right tree)))]))

它按我的预期工作


使用新版本的函数编辑问题后进行更新。

这是朝着正确方向迈出的一步。其中有一些正确的部分,也有一些不正确的部分。

函数就像可以连接在一起的盒子。有些电线上有东西进来,有些电线上有东西出去。每个盒子都有其正确的使用方式:电线的数量以及预期流入其中的物质。

您的新版本:

(define (treeFold f initial tree) 
  (cond 
    [(emptyNode? tree) 
          (f initial 0)] 
    [else (f (node-value tree)                 ;; (1)
             (f (treeFold f                    ;; (2)
                   (treeFold f 
                      (treeFold f initial 
                         (node-left tree)) 
                      (node-middle tree)) 
                    (node-right tree))))]))

f需要两个参数。(f initial 0) looks是的,至少在这方面。来电(1)以及。但是调用f at (2)仅提供一个参数f,所以不可能是正确的。

接下来说说它的含义。三个嵌套调用treeFold are almost右:我们“进入”(node-left tree),即左子树,其中initial作为初始值,然后我们从中得到结果并使用it作为新的初始值进入中间子树,并使用计算结果遍历右子树。好的。是done。那就是final我们需要的结果——不需要将其输入f任何进一步。所以这两个电话f上面的三个嵌套调用treeFold根本不需要。

除此之外,我们该怎么办(node-value tree)?它适合在哪里?答案是,它应该与initial值,通过调用方式f,以及result of that应该用作我们遍历的初始值left子树;我们的价值start折叠。

基本情况也是不正确的。我们已经拥有了initial,为什么我们需要将它与0突然间?以及为什么0?我们可以折叠在一棵树上strings,例如,将字符串与数字组合0没有多大意义。

No, 0将会supplied作为调用中的初始值treeFold, like

(define (sumAllNumbersInWholeTree tree)
  (treeFold + 0 tree))

有了带弦的树,我们可以例如定义

(define (collectAllStringsInWholeTree tree)
  (treeFold string-append "" tree))

答案的初始版本如下。用你的新理解回顾一下它的(稍微编辑过的)示例。 :)


For

(define tree 
    (node 7 
          (node 5 (emptyNode) (emptyNode) (emptyNode)) 
          (node 20 (emptyNode) (emptyNode) (emptyNode)) 
          (emptyNode)))

根据规格,它必须是

47 == (treeFold + 15 tree)
   == (treeFold + 15 
        (node 7 
          (node 5 (emptyNode) (emptyNode) (emptyNode)) 
          (node 20 (emptyNode) (emptyNode) (emptyNode)) 
          (emptyNode)))
   == (treeFold + 
          (treeFold + 
              (treeFold + (+ 15 7)
                  (node 5 (emptyNode) (emptyNode) (emptyNode)))
              (node 20 (emptyNode) (emptyNode) (emptyNode)))
          (emptyNode))
   == (treeFold + 
          (treeFold + 
              (treeFold +  
                   (treeFold + 
                       (treeFold + (+ 22 5) (emptyNode))
                       (emptyNode))
                   (emptyNode))
              (node 20 (emptyNode) (emptyNode) (emptyNode)))
          (emptyNode))
   == (treeFold + 
          (treeFold + 
              (treeFold +  
                   (treeFold + 27
                       (emptyNode))
                   (emptyNode))
              (node 20 (emptyNode) (emptyNode) (emptyNode)))
          (emptyNode))
   == (treeFold + 
          (treeFold + 
              (treeFold + 27
                   (emptyNode))
              (node 20 (emptyNode) (emptyNode) (emptyNode)))
          (emptyNode))
   == (treeFold + 
          (treeFold + 27
              (node 20 (emptyNode) (emptyNode) (emptyNode)))
          (emptyNode))
   .........

(写作==为“等于”)。这已经为您提供了完整定义所需的一切,即

(treeFold + i (node v lt md rt))
==
(treeFold +
   (treeFold +
      (treeFold + (+ i v) lt)
      md)
   rt)

and

(treeFold + i (emptyNode))
==
i
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

球拍中的树形折叠 的相关文章

  • 二叉树的列表实现是否可扩展?

    我正在写一个简单的编解码器 该树将被预先计算 一旦构建就不会发生任何变化 它只会被搜索 平衡二叉树的所有叶节点都是信号值 内部节点是近似压缩表示 如果我有很大的叶节点值 使用 stl 矢量的列表实现是否可扩展 目前我不知道有多大 列出实现
  • 在 oracle 树查询中连接其他表

    给定一个简单的 id description 表t1 比如 id description 1 Alice 2 Bob 3 Carol 4 David 5 Erica 6 Fred 以及一个父子关系表t2 比如 parent child 1
  • 在 SML 中使用foldr 连接字符串

    我正在尝试声明一个函数 字符串列表 gt 字符串 例如输入 Chicago city USA 应该返回 Chicago city USA 到目前为止我所做的是 fun gather ts foldr op ts 这似乎有点符合 但问题是 我
  • 展开方案中的函数

    Goal 实施unfold仅使用两个参数的函数 论据 第一个参数是 f 它接受某种类型 I 的初始值并返回 nil 或两个元素的 cons 对 这两个元素中的第一个是某种类型 A 的列表中的下一个元素 下一个初始值又是某些类型 I 第二个参
  • 树 /f cmd 修改日期。 Windows Powershell

    我需要创建一个 tree驱动器的文件夹 子文件夹和修改日期的列表 tree f命令效果很好 但我需要添加修改日期 我怎样才能做到这一点 它不会那么漂亮 但你可以使用 Recurse使用 Get ChildItem 选项来查找所有这些 此外
  • C 有没有做字符串加法的工具?

    我正在创建一个函数 该函数返回函数的导数 该函数表示为树形结构 x 5 3 14 x 具有以下形式的节点 typedef struct node char fx function struct node gx left hand side
  • 命令提示符中树的输出

    我希望能够使用 tree F A gt desktop file txt 命令仅输出文本文件 目前 它输出每个文件扩展名 有谁知道有一个简单的方法可以做到这一点 Tree仅接受几个命令行参数 c gt Tree Graphically di
  • haskell 的foldr 总是采用两个参数的lambda 吗?

    Haskell 新手在这里 我正在用 haskell 解决这个问题 Eliminate consecutive duplicates of list elements If a list contains repeated elements
  • 提取给定节点的所有父节点

    我正在尝试使用以下命令提取每个给定 GO Id 节点 的所有父级EBI RDF sparql 端点 https www ebi ac uk rdf services sparql 我是根据this https stackoverflow c
  • 使用map或reduce或filter,在Scheme中,计算列表中有多少个元素[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 number length 1 1 0 1 0 0 这假设返回 6 我知道如何使用长度并找到它 但我不知道如何在没有长度的情况下使用映射或过
  • Lisp 中的 (定义 (平均 ....))

    我只是在玩scheme lisp 并正在考虑如何纠正我自己的定义average 我不确定如何做一些我认为需要的事情 定义一个接受任意数量参数的过程 计算这些参数 将参数列表传递给 以将它们加在一起 有人有定义的例子吗average 我似乎对
  • 如何修复 STL 样式容器以容纳不完整或抽象类型?

    几天前 我尝试以与 STL 容器相同的风格编写一个基本的树实现 现在我尝试在我的代码中使用它 但是有两件事似乎不起作用 但可以说std vector 即 使用不完整类型和使用抽象类型 如何修复我的树实现以获得此功能 我尝试稍微压缩一下我的代
  • 方案中的多维向量?

    我之前问过一个关于方案中数组的问题 结果它们被称为向量 但在其他方面基本上与您期望的相同 有没有一种简单的方法可以在 PLT 方案中处理多维 arrays 向量 出于我的目的 我想要一个名为make multid vector或者其他的东西
  • 从 XML 构建树结构的速度很慢

    我正在将 XML 文档解析为我自己的结构 但对于大型输入来说构建它非常慢 是否有更好的方法来做到这一点 public static DomTree
  • 如何使用 XSLT 从平面 XML 列表构建树?

    我使用极简 MVC 框架 其中PHP控制器手上的DOM模型 to the XSLT 视图 c f okapi http okapi liip ch 为了构建导航树 我在 MYSQL 中使用了嵌套集 这样 我最终得到一个如下所示的模型 XML
  • 在Racket中将结构递归转化为累积递归

    我有一些代码来查找最大高度并将其替换为关联的名称 身高和姓名有单独的列表 每个列表的长度相同且非空 我可以使用结构递归来解决这个问题 但必须将其更改为累积递归 而且我不确定如何做到这一点 我见过的所有例子都让我困惑 有人能够将代码变成使用累
  • 在应用 varImp 函数时使用带插入符号的 xgbTree 方法和目标变量的权重时出现非树模型错误

    当我使用 Caret 包中的 train 函数创建模型以使用权重进行梯度提升时 在使用 varImp 函数时出现错误 表示它没有检测到树模型 但当我去掉重量时它就起作用了 下面的代码产生错误 set seed 123 model weigh
  • O(1) 算法确定节点是否是多路树中另一个节点的后代?

    想象一下下面的树 A B C D E F 我正在寻找一种方法来查询 F 是否是 A 的后代 注意 F 不需要是directA 的后代 在这种特殊情况下这是正确的 只需要针对更大的潜在后代节点池测试有限数量的潜在父节点 当测试一个节点是否是潜
  • 将2-3-4树转换为红黑树

    我正在尝试将 2 3 4 树转换为 java 中的红黑树 但我无法弄清楚它 我将这两个基本类编写如下 以使问题简单明了 但不知道从这里到哪里去 public class TwoThreeFour
  • d3.js:修改树布局中的链接

    抱歉我的英语不好 我在这里使用这个例子 http bl ocks org mbostock 4339083 http bl ocks org mbostock 4339083构建树形图 但我用矩形更改了根的子级中的圆圈 现在该图有点混乱 因

随机推荐

  • WPF透明边框导致UI停止重绘

    作为后续我之前的问题 我想知道如何正确使用透明窗 如果我将窗口设置为使用透明度 UI 有时会出现停止响应的情况 实际发生的情况是 UI 根本没有按其应有的方式更新 不出现动画 页面似乎无法导航 然而 如果你观察调试器点击按钮 链接等 确实有
  • 你能强制将枚举值序列化为整数吗? [复制]

    这个问题在这里已经有答案了 可能的重复 如何将枚举值序列化为 int Hi all 我想知道是否有一种方法可以强制将枚举值序列化为其整数值 而不是其字符串表示形式 让您了解一下上下文 在严重依赖 Web 服务的 Web 应用程序中 我们为所
  • 不能子类化 UIColor 吗?

    我正在尝试对 UIColor 进行子类化 但我似乎无法弄清楚出了什么问题 在我的 PColor h 中 import
  • 为什么“隔空敲击”手势在我的 Unity/MRTK 应用程序中的 HoloLens1 上不起作用?

    我有一个 Unity 应用程序 我想将其与 Microsoft 混合现实工具包 MRTK 集成 当我将 MRTK v2 1 或 v2 2 包添加到 Unity 项目时 我可以在 Unity 编辑器中模拟 隔空敲击 手势 并且应用程序会注册该
  • 新信号连接到旧插槽而不是单独的插槽

    我正在尝试标记数据跟踪的 x 跨度 并使用 tagNames 起始 x 值和结束 x 值填充表 我正在使用 突出显示 对象的字典来跟踪 x 跨度 以防以后需要对其进行编辑 增加或减少 字典将 x 起始值映射到突出显示对象 因为 x 起始值应
  • 从 Bigquery 中的时间戳提取日期:一种更好的方法

    向 Bigquery 专家提出一个简短的问题 以下是使用标准 SQL 从 Bigquery 中的时间戳中提取日期的两种方法 standardSQL 1 DATE TIMESTAMP MILLIS CAST timestamp AS INT6
  • 当我需要引用自身时如何设计结构[重复]

    这个问题在这里已经有答案了 My 上一个问题告诉我 Rust 不能在结构中引用自身 所以我的问题是 当我需要引用自身时如何设计一个结构体 我们可以以这个结构体为例 struct SplitByChars lt a gt seperator
  • 当用户按下设备音量键时,搜索栏拇指位置发生变化

    我使用搜索栏来控制设备的音量 我只需在触摸板上拖动搜索栏的拇指即可更改设备的音量 但是当用户按下音量 侧面 键时 我需要相应地设置搜索栏拇指位置 我该怎么做 请告诉我 Thanks 我通过重写 onkeydown 事件得到了解决方案 Ove
  • Pygame set_alpha 不适用于尝试的背景淡入淡出

    我一直在尝试创建一个简短的代码 用于可以淡入和从黑色淡出的项目 但由于某种原因 只有淡入功能在工作 而淡出功能或多或少被跳过 通过给他们参数 我确认问题出在第二个函数中 并且透明度根本没有改变 这是我的代码 import pygame sc
  • 未找到带点(IP 地址)的路由,返回 404

    I use Lumen 5 4 这就是我的路线设置方式 app gt get ip ip GeoIpController class show The ip 路由参数应该是一个IP地址 其中带点 然而 当路线中有点时 似乎就会出现问题 它返
  • CharBuffer 位于内存映射的 ByteBuffer 之上,无需使用大量堆空间

    我正在编写一个java代码来在一个大的txt文件 6 8Gb 中搜索电子邮件地址和密码 我已经编写了代码 它可以处理 200Mb txt 文件并给出输出 但是当我输入 500Mb 文件时 它显示以下错误 Exception in threa
  • TensorFlow:“ValueError:没有为任何变量提供梯度”

    我正在张量流中实现 DeepMind 的 DQN 算法 并在我调用的线路上遇到此错误optimizer minimize self loss ValueError No gradients provided for any variable
  • PHP 表单 - 提交时停留在同一页面

    我有一个位于文件中的 PHP 表单contact html 该表格是从文件处理的processForm php 当用户填写表单并单击提交时 processForm php发送电子邮件并引导用户至 processForm php该页面上有一条
  • 将多个 IIS7 重写规则(重定向)合并为一个

    我使用iis7的URL重写模块来完成几件事 301重定向规则从非www到www 301 将规则 info 重定向到 com 已移至我的域的 com 版本 301 从旧页面重定向规则 例如 page name asp 改为 page name
  • Android Facebook 风格幻灯片

    新的 Facebook 应用程序及其导航非常酷 我只是想看看如何在我的应用程序中模拟它 任何人都知道如何实现它 单击左上角按钮后 页面会滑动并显示以下屏幕 Youtube 视频 我自己尝试过这个 我能找到的最好方法是使用 FrameLayo
  • 如何在 ruby​​mine 中停止/终止服务器(开发)

    这里是新手 我在 ruby mine 中创建了一个 Rails 项目来运行公共文件夹中的默认 index html 我按下了 shift F10 键 这与终端的 Rails 服务器相同 这就是我得到的 home bubble rvm rub
  • Java:转义 XML 文本内容而不是整个文本

    我想发送下面的 XML 请求 文本内容应该被转义 但标签不应该被转义 我试过了使用下面的转义逻辑 String str escapeXml11 req 然而 我的整个请求都被逃脱了 因此 它不再是有效的 XML 我原来的字符串 String
  • 在 Flexbox 中组合行和列

    我有三个元素article 照片 类别 然后是帖子信息 我试图弄清楚如何让类别元素堆叠在帖子信息列的顶部 2 在 3 的顶部 如果您正在查看所附照片 因此它看起来像两个 50 的列 即使有是三个弹性元素 flexbox display fl
  • 如何更改 gWidgets RGtk2 中鼠标光标的形状?

    在gWidgets中的ggraphics绘图区域中 将鼠标光标更改为 GDK TCROSS 但我想要与gwindow GDK LEFT PTR 相同的鼠标光标 library gWidgets library gWidgetsRGtk2 l
  • 球拍中的树形折叠

    我是 Racket 的初学者 我有这样的问题 定义一个结构 node 其中包含以下字段 value left middle right 该结构表示树结构中的节点 这些字段包含存储在节点 左子树中的值 分别为中子树和右子树 如果一个子树 不存