Расчет списков снизу вверх - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь вычислить (используя операторы) самый внутренний список, затем второй самый внутренний список и т. Д., Пока не останется больше списков. Я также пытаюсь сделать это так, чтобы он мог вычислять список независимо от того, сколько в нем вложенных списков.

import operator

lst = [['x1', '*', ['x2', '*', 'x3']], '-', 'x3']
dictionary = {'x1': 4, 'x2': 5, 'x3': 7}
operator_dictionary = {"+": operator.add, "-": operator.sub, "*": 
operator.mul, "/": operator.truediv}

def BINARYEXPR(program, dictionary):
    for i in range(len(program)):
        if isinstance(program[i],list):
            return BINARYEXPR(program[i],dictionary)

    operator = operator_dictionary[program[1]]
    operand1 = dictionary[program[0]]
    print("operand1: ", operand1)
    operand2 = dictionary[program[2]]
    print("operand2: ", operand2)

    return operator(operand1,operand2)

print (BINARYEXPR(lst,dictionary))

Итак, я хотел сначала вычислить x2 * x3 (5 * 7), что должно дать нам 35, затем вычислить x1 * 35 (4 * 35), которое должно дать нам 140, а затем, наконец, принять 140 - x3 (140-7), который должен вернуть 133. Но вместо этого мне удалось вычислить только самый внутренний список и нажать оператор возврата (операнд1, операнд2), который завершает функцию.

Так что я застрял в рекурсии, так как не могу понять, как перейти ко второму внутреннему списку всякий раз, когда вычисляется самый внутренний список.

1 Ответ

0 голосов
/ 20 ноября 2018

Рекурсивная функция должна выполнять следующую работу:

import operator


lst = [['x1', '*', ['x2', '*', 'x3']], '-', 'x3']
dictionary = {'x1': 4, 'x2': 5, 'x3': 7}
operator_dictionary = {"+": operator.add, "-": operator.sub, "*":
                       operator.mul, "/": operator.truediv}


def calc(lst):
    if type(lst) == str:
        return dictionary[lst]

    if len(lst) != 3:
        raise ValueError("Incorrect expression: {}".format(lst))

    op = operator_dictionary[lst[1]]
    return op(calc(lst[0]), calc(lst[2]))

Поскольку вы используете инфиксную нотацию, каждое выражение имеет три компонента: выражение, оператор, выражение. Функция работает, предполагая, что 0-й и 2-й элементы являются операндами, а 1-й элемент является оператором. Мы вычисляем подвыражения рекурсивно, а затем применяем операцию. Кроме того, если в какой-то момент наша функция получит список с длиной, отличной от 3, мы добавим ее, поскольку это не может быть правильно сформированным выражением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...