#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
оператора.