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));
    }
}