algorithm - 在递归通过分支时跟踪路径(更多信息在描述中)- 使用 Tcl

标签 algorithm recursion tcl

背景:

  • 用 Tcl 编写脚本
  • 使用名为 IDSBatch 的工具运行脚本来自 linux (centos) 终端

我有一个包含 block 、组和寄存器的系统(.rdl 文件)。

block 可以包含其他 block 、组或寄存器。而组只能有寄存器和寄存器独立。

我遇到的问题是我想打印出每个寄存器的“地址”,即与该特定寄存器关联的 block 、组和寄存器的名称。例如:

               ______Block (a)______
               |                   |                
           Block (b)            reg(bob)
           |     |
    group(tall) group(short)
   |       |              |
reg(bill) reg(bobby)     reg(burt)

最后的输出应该是这样的:

reg one: a.bob

reg 2:a.b.tall.bill

第三项:a.b.tall.bobby

第四项:a.b.short.burt

真正的问题来自 block 可以包含 block 的事实。所以系统不会总是一到三个级别(一个级别是 Block--reg,两个级别是 Block--Block--reg 或 Block ---group---reg 等等......)

我倾向于某种递归解决方案,我会访问元素说一个 block 并获取它的所有子元素(组、 block 和 regs)然后我会使用相同的函数来访问它的子元素(除非它是登记)。通过这种方式,它可以处理任何组合 block 组和寄存器,但后来我陷入了如何跟踪特定寄存器地址的困境。

感谢您花时间阅读本文,如有任何意见或建议,我们将不胜感激。

最佳答案

您可以使用列表来做到这一点。

从一个空列表开始,您将所有地址部分附加到它。如果遇到寄存器,则可以构建从前到后的路径。在每一级递归之后,您删除最后一个元素以摆脱您处理的部分。

示例:您刚刚看到收银机bill。然后,您的列表是 a -> b ->tall。要获取地址,您需要遍历列表并将节点连接在一起,然后将 bill 附加到结果字符串。

所以,你的递归函数有点像

  • 如果当前处理的元素是寄存器:重构路径。
  • 如果当前处理的元素不是寄存器:将路径元素追加到列表中,使用该列表调用函数并删除该列表的最后一个元素。

关于algorithm - 在递归通过分支时跟踪路径(更多信息在描述中)- 使用 Tcl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24704660/

相关文章:

c++ - 树的直径

算法:寻找具有不完美值的模式

javascript - AngularJS : Expandable recursive tree table

algorithm - 找到方程式的数学算法

c++ - 递归:理解(子集和)包含/排除模式

Tcl/Tk 绑定(bind)需要全局变量?

java - 我应该测试算法的确切结果还是只测试结果的某些元素?

c++ - 有向图 - 如何计算图中每个其他顶点可到达的顶点数?

python - 有没有办法将 Python/Tkinter 连接到已经运行的 Tcl/Tk 应用程序?

linux - tcl - 检测 x11 是在 ARM 还是 x86 上运行