Рекурсивная функция, игнорирующая условие исключения - PullRequest
0 голосов
/ 28 января 2020

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

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

Чтобы избежать обработки любых значений дважды, в the_loop добавлено условие, предназначенное только для обработки значений, которые еще не были обработаны. Каждый раз, когда значение обрабатывается, оно добавляется в список исключений и должно пропускать l oop.

def the_recursive_func(key):
   values = get_values(key) # values is a list of numbers
   processed_values = {}

   def the_loop(list_of_values):
      not_processed = [v for v in list_of_values if v not in processed_values.keys()]

      for v in not_processed:
          processed = process_value(v)
          processed_values[v] = processed
          new_values_list = get_values(v)
          the_loop(new_values_list)

   the_loop(values)
   return processed_values

Вместо этого я обрабатываю множество значений дважды. Я изо всех сил пытаюсь увидеть, где это идет не так. Если я изменю для l oop на:

      for v in not_processed:
          if v in processed_values.keys():
             continue
          processed = process_value(v)
          processed_values[v] = processed
          new_values_list = get_values(v)
          the_loop(new_values_list)

Тогда я получу результаты, которые я ищу, но А) это спагетти и Б) Я упускаю что-то фундаментальное в том, почему исходный код не работает.

1 Ответ

0 голосов
/ 28 января 2020

Вы исключаете значения только в начале функции. Если вам нужно исключить значения, которые обрабатываются в более ранних итерациях l oop (возможно, в рекурсии), вам нужно каждый раз выполнять тест через l oop.

    def the_loop(list_of_values):
        for v in list_of_values:
            if v in processed_values:
                continue
            processed = process_value(v)
            processed_values[v] = processed
            new_values_list = get_values(v)
            the_loop(new_values_list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...