【发布时间】:2016-10-26 03:53:44
【问题描述】:
我正在编写一个使用递归结构配置的库。
为了便于讨论,我将这些图形结构称为“树”,因为有一个已定义的“根”节点,并且每个节点都可以引用多个“子节点”。正确配置后,不应存在环路。它与树略有不同,因为子节点可以在多个地方使用。
A A
/ \ / \
B C B C
/ \ / \ / \ \
D E F D E |
\ |
F
尽管 E 和 F 在多个层上多次使用,但这些都是可以接受的。节点可以有多个父节点和多个子节点,但绝不能是它们自己的祖先。
然而
A
|
B
|
A
|
...
由于循环不可接受。
如果要给我的库提供一个带有循环的图表,那么库会发生坏事,所以我正在寻找一种方法来健全地检查输入。我需要确定通过这个结构的递归是否会终止,或者它是否会陷入无限循环。实际上,我需要在有向图中寻找循环。
【问题讨论】:
-
您的要求就像 OO 中的继承,但有多个父级,我的意思是它与在图中检测循环略有不同。
-
检测多继承的循环或接口继承的循环检测是一样的。我之前没有注意到这一点。如果您对编译器如何检测到这一点有任何了解,那将会很有趣。
标签: algorithm tree infinite-loop graph-algorithm