#python
#питон
Вопрос:
Если у меня есть:
['add', 12, 12]
Я бы просто сделал:
if i[0] == 'add': a = i[1] i[2] return a
но что, если это что-то вроде
['add', 12, ['add', 12, 12]]
Я знаю, что мне нужно сначала решить [‘добавить’, 12, 12] внутри, используя рекурсию, но я не уверен, как это сделать. И если это для чего-то подобного:
['add', 12, ['mul', 6, ['sub', 6, 4]]]
Как бы я решил эту проблему с помощью рекурсии?
Комментарии:
1. Если операндом является рекурсия списка на нем.
Ответ №1:
Вы можете использовать рекурсию:
import operator as op def run_op(l): if not isinstance(l, list): return l return getattr(op, l[0])(*map(run_op, l[1:])) r = ['add', 12, ['mul', 6, ['sub', 6, 4]]] print(run_op(r)) #24
Ответ №2:
Просто проверьте, являются ли элементы списками через isinstance
. Если это так, рекурсивно вызовите свою функцию решения, в противном случае просто оставьте ее как есть.
def solve(i): if i[0] == "add": if isinstance(i[1], list): x = solve(i[1]) else: x = i[1] if isinstance(i[2], list): y = solve(i[2]) else: y = i[2] return x y
Чтобы реализовать умножение, вычитание и т. Д., Просто добавьте больше случаев во внешнее if, следуя аналогичной логике.
Ответ №3:
Проверьте, является ли параметр списком. Если это так, предположим, что два операнда должны пройти рекурсию, чтобы получить соответствующие значения, а затем выполнить указанную операцию. Если параметр не является списком, просто верните его как есть.
def calc(A): if not isinstance(A,list): return A # not a list, return value op,left,right = map(calc,A) # recurse to get values if op == "add": return left right # perform operation... if op == "sub": return left-right if op == "mul": return left*right if op == "div": return left/right print(calc(['add', 12, ['mul', 6, ['sub', 6, 4]]])) # 24