Python出现'int'类型不可迭代报错,邻接表递归代码如何修复
报错原因
- 递归调用的第一个参数传递错误:首次调用传入的是完整邻接表字典,递归时错误传入了
AList[i],这是当前节点的邻接节点列表,不是原邻接表字典。下一层函数执行end2 in AList[end1]时,AList已经是列表类型,AList[end1]取到的是列表对应下标的整数值,in语法要求右侧是可迭代对象,因此抛出整数不可迭代的错误。 - 无向图遍历未加访问限制:邻接表存储的是无向图,没有访问标记会导致相邻节点循环递归,最终栈溢出。
- 全局变量计数逻辑缺陷:多次调用函数会累计历史计数结果,不符合单次调用的预期。
修复代码
保留原有递归计数逻辑的修复版本如下:
def BackAndForth(AList, end1, end2, visited=None): # 初始化访问标记集合,避免循环递归 if visited is None: visited = set() count = 0 visited.add(end1) # 判断目标节点是否在当前节点的邻接列表中 if end2 in AList[end1]: count += 1 # 遍历所有邻接节点递归查询 for i in AList[end1]: if i != end2 and i not in visited: # 第一个参数固定传完整邻接表字典,新增访问标记传递 count += BackAndForth(AList, i, end2, visited.copy()) return count Alist = { 0: [2, 3, 6], 1: [3, 5, 6], 2: [0, 3, 4], 3: [0, 1, 2, 4], 4: [2, 3, 5], 5: [1, 4, 6], 6: [0, 1, 5], } end1 = 0 end2 = 0 print(BackAndForth(Alist, end1, end2))
如果你仅需要判断指定元素是否存在于某节点的邻接列表中,不需要递归遍历所有路径,可直接使用极简写法:
def check_exist(AList, node, target): return target in AList.get(node, [])
内容的提问来源于stack exchange,提问作者Maheedhar A
相关产品推荐
相关产品推荐

