Таблица истинности с использованием рекурсии

Я пытаюсь создать таблицу истинности в С# для 3 символов, поэтому она должна создавать 2 ^ 3 = 8 таблиц. но мой рекурсивный метод не работает.

Мой код ниже. в каждом цикле я добавляю символ и создаю новый словарь с одним истинным и одним ложным значением.

    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

person Aseem Malhotra    schedule 24.05.2019    source источник
comment
А для тех из нас, кто играет дома, как должны выглядеть результаты?   -  person TheGeneral    schedule 24.05.2019
comment
я добавил ожидаемый результат. Благодарность   -  person Aseem Malhotra    schedule 24.05.2019
comment
Вы забыли добавить определение PLTrue(model);   -  person Camilo Terevinto    schedule 24.05.2019
comment
я пока просто печатаю в нем таблицу истинности. как только я получу полную таблицу истинности, я продолжу. Благодарность   -  person Aseem Malhotra    schedule 24.05.2019
comment
Что ж, результаты именно такие, какие я ожидал от этого кода. Вы пробовали пошаговую отладку? Либо эта рекурсия даже не близка к тому, что вы ищете, либо вы ошиблись с типом данных.   -  person Camilo Terevinto    schedule 24.05.2019
comment
я изменил тип данных. вместо метода TTCheckAll() было логическое значение, а возврат был (TTCheckAll(true) && TTCheckAll(false)). но результат был тот же.   -  person Aseem Malhotra    schedule 24.05.2019


Ответы (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));
    }
}
person Roman Koliada    schedule 24.05.2019

Измените с этим.

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

    }
}
person Mehmet Ordu    schedule 24.05.2019
comment
я пробовал, но он просто выдает 1 таблицу истинности, а не 8 - person Aseem Malhotra; 24.05.2019