Tree 使用延续传递样式通过广度优先索引获取子树

Tree 使用延续传递样式通过广度优先索引获取子树,tree,scheme,racket,continuation-passing,Tree,Scheme,Racket,Continuation Passing,这是一个后续问题。这个问题涉及深度优先索引(为此,我提供了一个深度优先连续传递样式的解决方案)。这里的问题是关于广度优先索引,特别是关于使用连续传递样式(CPS)解决问题 假设我有一棵树,它表示”(+(*56)(sqrt 3)): 节点的索引从根的0开始,并且是宽度优先的。在上面的图片中,我用它们的索引标记了所有节点以显示这一点 我想定义一个函数subtree bfs,它接受一棵树和一个索引号,并返回以给定索引为根的子树。例如: (定义树“(+(*56)(sqrt 3))) (子树bfs树0)

这是一个后续问题。这个问题涉及深度优先索引(为此,我提供了一个深度优先连续传递样式的解决方案)。这里的问题是关于广度优先索引,特别是关于使用连续传递样式(CPS)解决问题

假设我有一棵树,它表示
”(+(*56)(sqrt 3))

节点的索引从根的0开始,并且是宽度优先的。在上面的图片中,我用它们的索引标记了所有节点以显示这一点

我想定义一个函数
subtree bfs
,它接受一棵树和一个索引号,并返回以给定索引为根的子树。例如:

(定义树“(+(*56)(sqrt 3)))
(子树bfs树0);返回:'(+(*56)(sqrt 3)))
(子树bfs树1);返回:'(*5-6)
(子树bfs树2);返回:'(sqrt 3)
(子树bfs树3);报税表:5
(子树bfs树4);报税表:6
(子树bfs树5);报税表:3
我想用连续传球的方式来解决这个问题。如何定义
子树bfs


到目前为止,我有:

(定义(节点子节点)
;;(节点子节点123)->'()
;(节点子节点(+1(+23))->'(1(+23))
(cond[(配对节点)(cdr节点)]
[(空?节点)(错误“无效节点”节点)]
[else'()]))
(定义(遍历行和节点索引计数器k)
;;;“counter”是“nodes”中第一个节点的索引号。
(cond[(空?节点)(k计数器)]
[(=计数器索引)(车辆节点)]
[其他
(遍历行和(cdr节点)
指数
(+柜台1)
k) ))
(定义(children-k children索引k)
(如果为空,则为子项)
K
(兰姆达(柜台)
(子树bfs和(汽车子树)
指数
柜台
(儿童-k(cdr儿童)索引k‘‘‘‘‘)
(定义(子树bfs和节点索引计数器k)
(遍历行和节点)
指数
柜台
(children-k(映射节点子节点)
指数
k) ))
(定义(子树bfs树索引)
(子树bfs&(列表树)
指数
0
(λ(最大指数+1)
;;(-max index+1 1)表示最大有效索引号。
(错误“索引超出范围”索引)))
此实现似乎工作正常。然而,它似乎相当长。由于我对CPS缺乏经验,我认为必须有一个更好的CPS解决方案来解决这个问题。有更好的CPS解决方案吗

注1:请原谅我没有充分评论代码。我必须承认,我自己并不完全理解这个解决方案(!)我很惊讶我能在第一时间找到一个解决方案


注2:这个问题可能更适合代码审查站点。然而,由于缺乏对计划和诈骗的关注,像这样的问题可能永远不会得到回答。

只是想澄清一下:你知道,像我在上一个问题中给出的那样,基于议程的搜索很容易做到吗?显然,使用CPS必须是可能的,当然,要求CPS回答是可以的,但我发现CPS太难让我动脑了。@tfb是的,谢谢你的回答;这是我在实践中会用到的。由于我已经为深度优先找到了一个令人满意的CPS解决方案,我认为为宽度优先找到一个CPS解决方案可能会很有启发性。事实证明,广度优先比预期的要复杂得多。@tfb如果是这样,请允许我谦恭地提请您注意。我认为这是清楚的,并希望它能有所启发。CPS将计算线性化,使其本质上类似于递归下降解析。@WillNess:谢谢,我会读到的。CPS是我发现我能理解的东西之一,如果我看一看真正的代码,我就能理解它,一段时间后,当我看它的时候,但20分钟后,我必须重新理解它。@tfb有人曾经说过,没有真正的理解(“在数学中”我认为是),人们只是习惯了一些事情。:)编写CPS就像递归一样,我们需要放手,仅仅依靠这样的想法,如果我们做得对,那么它应该会工作。也许是这样的