我正在尝试在c#中为3个符号创建一个真值表,因此它应该产生2 ^ 3 = 8个表。但我的递归方法不起作用。
我的代码如下。在每个循环中,我添加一个符号,并使用一个true和一个false值制作新字典。
public void TTEntails()
{
Queue<string> s = new Queue<string>();
s.Enqueue("p");
s.Enqueue("q");
s.Enqueue("r");
TTCheckAll(s, new Dictionary<string, bool>());
}
public void TTCheckAll(Queue<string> symbol, Dictionary<string, bool> model)
{
if (symbol.Count == 0)
{
PLTrue(model);
}
else
{
string topSymbol = symbol.Dequeue();
TTCheckAll(symbol, ReturnDict(model, topSymbol, true));
TTCheckAll(symbol, ReturnDict(model, topSymbol, false));
}
}
private Dictionary<string, bool> ReturnDict(Dictionary<string, bool> model, string key, bool value)
{
Dictionary<string, bool> newDict = new Dictionary<string, bool>(model);
newDict.Add(key, value);
return newDict;
}
产生的结果如下:
p, True
q, True
r, True
p, True
q, True
r, False
p, True
q, False
p, False
结果应该是
p, True
q, True
r, True
p, True
q, True
r, false
p, True
q, false
r, True
p, True
q, false
r, false
p, false
q, True
r, True
p, false
q, True
r, false
p, false
q, false
r, True
p, false
q, false
r, false
答案 0 :(得分:2)
您需要将队列的副本传递到每个true / false分支:
public void TTCheckAll(Queue<string> symbol, Dictionary<string, bool> model)
{
if (symbol.Count == 0)
{
PLTrue(model);
}
else
{
string topSymbol = symbol.Dequeue();
TTCheckAll(new Queue<string>(symbol), ReturnDict(model, topSymbol, true));
TTCheckAll(new Queue<string>(symbol), ReturnDict(model, topSymbol, false));
}
}
答案 1 :(得分:0)
对此进行更改。
public void TTCheckAll(Queue<string> symbol, Dictionary<string, bool> model,bool value )
{
if (symbol.Count == 0)
{
PLTrue(model);
}
else
{
string topSymbol = symbol.Dequeue();
TTCheckAll(symbol, ReturnDict(model, topSymbol, value),(value?false:true));
}
}