Truth table 使用递归
Truth table using recursion
我正在尝试在 c# 中为 3 个符号创建一个真理 table,因此它应该产生 2^3 = 8 tables。但是我的递归方法不起作用。
我的代码如下。在每个循环中,我添加一个符号并使用一个真值和一个假值制作新字典。
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
以此为变。
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));
}
}
您需要将队列副本传递给每个 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));
}
}
我正在尝试在 c# 中为 3 个符号创建一个真理 table,因此它应该产生 2^3 = 8 tables。但是我的递归方法不起作用。
我的代码如下。在每个循环中,我添加一个符号并使用一个真值和一个假值制作新字典。
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
以此为变。
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));
}
}
您需要将队列副本传递给每个 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));
}
}