Таблица истинности с использованием рекурсии - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь создать таблицу истинности в c # для 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

Ответы [ 2 ]

2 голосов
/ 24 мая 2019

Вам необходимо передать копию очереди в каждую ветвь 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));
    }
}
0 голосов
/ 24 мая 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));

    }
}
...