You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:36:09