Подсчитайте, сколько раз повторение происходило в дереве

#python #recursion

Вопрос:

Привет, мне нужна помощь с этой функцией:

 def order_of_succession(self, alive: Set[int], succesors: Optional[List[List[int]]] = None, order: int = 1) -gt; Dict[int, int]:  if succesors is None:  succesors = []  for child in self.children:  temp = []  if child.pid in alive:  temp.append(child.birth_year)  temp.append(order)  temp.append(child.pid)  succesors.append(temp)  child.order_of_succession(alive, succesors, order   1)  succesors = sorted(succesors, key=lambda x: (x[0], x[1]))  succesion = {}  for elem in succesors:  succesion[elem[2]] = elem[1]  return succesion  

Единственная проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда рекурсия завершается для одного дочернего заказа, порядок возвращается к исходному порядку для первого проверенного дочернего заказа. Это выводится из этой функции:

 {127: 1, 290: 1, 561: 2, 490: 2, 611: 2, 702: 2, 390: 3, 590: 3, 106: 4, 429: 4, 1000: 4, 101: 4, 898: 4, 253: 5}  

Мне нужно, чтобы порядок увеличивался каждый раз, когда вызывается функция, но я не знаю, как это сделать. Спасибо за любую помощь.

Ответ №1:

Нет хорошего способа сделать то, что вы хотите, с вашим текущим рекурсивным API, так как вы не можете легко вернуть обновленное order (так как вы уже возвращаете что-то другое). Однако, если вы измените ситуацию так, чтобы рекурсивная функция была вспомогательной по отношению к основной функции, вы можете использовать нелокальную переменную для ее правильной обработки:

 def order_of_succession(self, alive: Set[int]) -gt; Dict[int, int]:  successors: List[List[int]] = [] # both of these variables will be updated in helper  order = 1   def helper(person):  nonlocal order # this lets us modify order  for child in person.children:  if child.pid in alive:  successors.append([child.birth_year, order, child.pid])  order  = 1 # which we do here  helper(child)   helper(self)   succesors = sorted(succesors, key=lambda x: (x[0], x[1])) # the rest is unchanged  succesion = {}  for elem in succesors:  succesion[elem[2]] = elem[1]  return succesion  

Это не совсем то, о чем вы просили, так как я обновляю только order для живых детей. Если вы хотите, чтобы порядок увеличивался даже при повторении на неживом потомке, вы можете переместить order = 1 строку за пределы if оператора.