Как использовать рекурсию во вложенном списке для добавления/вычитания/умножения/деления?

#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