我正在尝试编写一个逻辑门电路模拟器,到目前为止一切正常,除了一件事。我的结构看起来像这样:
struct node
{
int number;
bool has_value;
bool is_input;
bool value;
Gate operation;
node* input1;
node* input2;
};
程序通过使用递归来计算输出值,因此结构中的任何类型的循环都会混淆一切。我的问题是:我如何检测这样的东西(见图),因为我无法想出任何有用的东西。
答案 0 :(得分:1)
解决问题的一个显而易见的方法是在每个节点中包含bool
,表示在当前模拟步骤中是否已访问该节点。
您最初想要将此设置为false
,例如在构造函数中。
然后,模拟步骤将包括遍历图形一次以清除标记。当且仅当当前设置了标志时,您才会从给定节点进行递归。
然后您将运行模拟步骤。这将以大致相同的方式进行,但逻辑相反。当您访问每个节点时,请检查其visited
标志。如果已设置,您可以立即返回(并且您刚刚在图中检测到一个周期)。否则,您设置标志,处理该节点的输入(等等 - 您通常的模拟" stuff"),然后执行递归调用以在其子节点上进行模拟。如果其中任何一个循环回到这个,那么该呼叫将立即返回(因为你已经设置了标志),结束了#34; leg"递归调用。