Python递归查询X步邻接项仅处理首个节点的问题求助
问题修复方案
核心错误原因
你的代码在for循环遍历邻接项时,处理第一个元素就直接return递归结果,直接终止了当前函数的循环逻辑,剩余邻接项永远不会被处理,这就是ID为7的节点始终不被执行的原因。
修正后的代码
class Item: def __init__(self, id_num: str, adjacent: list): self.id = id_num self.adjacent_items = adjacent def get_adjacent_x_steps(start: str, item_dict: dict, x: int, wip_set=None): """Get adjacent items for x steps""" if wip_set is None: wip_set = set() # 步数用完直接返回当前集合 if x == 0: return wip_set x -= 1 # 遍历当前节点所有邻接项 for item in item_dict[start].adjacent_items: wip_set.add(item) # 每个邻接项都递归走剩余步数,集合是可变对象,直接修改原对象即可 get_adjacent_x_steps(item, item_dict, x, wip_set) # 所有邻接项处理完再返回最终集合 return wip_set def example(): """Example items""" item1 = Item("1", ["4", "7"]) item2 = Item("4", ["5"]) item3 = Item("7", ["5"]) item4 = Item("5", ["8", "17"]) item_dict = {} for item in (item1, item2, item3, item4): item_dict[item.id] = item chained_items = get_adjacent_x_steps("1", item_dict, 2) # 输出结果为 {'4', '5', '7'},符合2步范围内的邻接项预期 print(chained_items) if __name__ == '__main__': example()
修改点说明
- 把
return语句移出了for循环,保证所有邻接项都能被遍历处理 - 递归调用不需要立即返回,因为我们传入的
wip_set是可变集合对象,所有递归调用都是往同一个集合里添加元素,不需要额外赋值操作 - 所有邻接项递归处理完成后,再统一返回最终的结果集合
额外优化建议
如果你的业务场景中邻接关系可能存在环路(比如A的邻接项包含B,B的邻接项又包含A),建议额外传入一个已访问节点集合,遇到已经处理过的节点直接跳过,避免出现无限递归导致栈溢出的问题。
内容的提问来源于stack exchange,提问作者Another Noob
相关产品推荐
相关产品推荐

