【问题标题】:Recursive function ignoring exclusion condition忽略排除条件的递归函数
【发布时间】:2020-05-13 07:18:22
【问题描述】:

我可能很厚,但我对为什么这个递归函数忽略我提供的排除条件感到困惑。

在下面的代码中,我取一个基值,并从另一个函数中获取对应值的列表。列表中的每个值都需要被处理,并且需要获取它自己的对应值列表,为此会发生相同的过程,直到处理完所有相关值。

为避免两次处理任何值,我在the_loop 中添加了一个条件,该条件仅用于处理尚未处理的值。每次处理一个值时,都会将其添加到排除列表中,并且应该跳过循环。

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

相反,我处理了大量的值两次。我正在努力看看这是哪里出了问题。 如果我将 for 循环更改为:

      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)

然后我得到了我正在寻找的结果,但是 A) 这是意大利面条,并且 B) 我遗漏了一些基本的东西,说明为什么初始代码不起作用。

【问题讨论】:

  • 在初始代码中,您先排除值,然后再开始添加任何值。另外,我可能遗漏了一些东西,但你甚至没有使用not_processed
  • 你循环的是list_of_values,而不是not_processed
  • 仅供参考,v not in processed_values.keys() 可以简化为 v not in processed_values,因为 in 只检查密钥。
  • @iz_ @Barmar 这是我的错误,我已经编辑了帖子——我确实在迭代not_processed。 @iz_ 这是设计使然 - 新列表可能包含比我要处理的更多的值
  • 注意,谢谢@Barmar!

标签: python loops recursion


【解决方案1】:

您只是排除了函数开头的值。如果您需要排除在循环的早期迭代中处理的值(可能在递归中),则需要在每次循环中进行测试。

    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)

【讨论】:

  • 谢谢@Barmar!你是对的,我误解了这里的事件顺序。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
  • 2021-08-15
  • 1970-01-01
  • 2020-06-23
相关资源
最近更新 更多