Python开发BFS因数分解算法时遇break语法错误求助
解决你的BFS代码中break语法错误及其他潜在问题
首先,针对你遇到的SyntaxError: 'break' outside loop问题,最可能的原因是缩进错误:
Python对缩进的要求极其严格,如果你的construct_path函数中,else块的缩进没有和对应的if对齐,而是意外和while循环处于同一层级,那么这个else会被解析为while循环的附带else子句(Python允许while循环拥有else块,仅当循环正常结束而非被break终止时执行),此时break语句就处于while循环体之外,自然会触发语法错误。
检查你的construct_path函数,确保else的缩进和它对应的if完全对齐,正确的写法应该是这样:
def construct_path(state, meta): action_list = list() while True: row = meta[state] if len(row) == 2: state = row[0] action = row[1] action_list.append(action) else: # 这里的else和上面的if对齐,确保在while循环体内 break # 注意:reverse()是原地修改列表,返回None,所以要先反转再返回 action_list.reverse() return action_list
除了这个语法错误,你的代码还有几个需要修复的潜在问题,否则即使解决了break的问题,BFS也无法正常工作:
- 方法名拼写错误:你在
Problem类中定义的是get_sucessors(少了一个字母c),但在breadth_first_search中调用的是problem.get_successors(parent_state),这会触发AttributeError,请将方法名修正为get_successors,并实现正确的后继状态生成逻辑(当前这个方法只是打印,没有返回任何后继状态)。 - Queue的
in操作符错误:Queue.Queue对象不支持in操作符来判断元素是否存在,你需要额外维护一个集合(比如open_set_elements)来跟踪已加入队列的状态,避免重复入队:open_set = Queue.Queue() open_set_elements = set() # 初始化时 open_set.put(start) open_set_elements.add(start) # 后续判断时 if child_state not in closed_set and child_state not in open_set_elements: meta[child_state] = (parent_state, action) open_set.put(child_state) open_set_elements.add(child_state) is_goal方法逻辑错误:当前你的is_goal总是返回True,这会导致BFS刚启动就返回初始状态,完全不符合找最小倍数的需求。你需要修改这个方法,判断当前状态是否是problem.n的倍数,且状态的每一位数字都属于problem.mainList。return action_list.reverse()的错误:list.reverse()是原地修改列表,返回值是None,所以你需要先调用reverse(),再返回列表,或者用切片return action_list[::-1]来生成反转后的新列表。
希望这些建议能帮你解决问题,顺利完成因数分解的BFS算法开发!
内容的提问来源于stack exchange,提问作者Andrew Willette
相关产品推荐
相关产品推荐

