背景:
- 用 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/