导读:本期聚焦于小伙伴创作的《如何用递归函数在航班图中找出所有从起点到终点的路径(无需额外参数)》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何用递归函数在航班图中找出所有从起点到终点的路径(无需额外参数)》有用,将其分享出去将是对创作者最好的鼓励。

在航班图这类有向图结构中,每个节点代表城市,边代表两个城市之间的直飞航班。要找出从起点到终点的所有路径,核心思路是沿着当前节点的邻接节点不断向下探索,当到达终点时记录当前路径,当没有可探索的邻接节点时返回上层递归,利用递归调用栈自动维护路径状态,不需要额外传入路径存储参数。

如何用递归函数在航班图中找出所有从起点到终点的路径(无需额外参数)

核心实现逻辑

递归函数的设计需要遵循两个核心原则:一是每次递归调用时,当前探索的节点就是新的起点,二是递归返回时不需要手动清理路径状态,因为递归栈的弹出会自动回到上一层的节点状态。具体步骤如下:

  • 定义递归函数,接收当前节点、终点、航班图三个参数,不需要额外传入路径列表
  • 如果当前节点等于终点,说明找到了一条完整路径,直接返回包含当前节点的路径列表
  • 如果当前节点没有邻接节点,返回空列表表示没有找到路径
  • 遍历当前节点的所有邻接节点,对每个邻接节点递归调用函数,将返回的所有路径前面拼接上当前节点,最终汇总所有路径返回

Python代码实现

以下是基于上述逻辑的具体代码实现,航班图用字典结构表示,键是城市名称,值是该城市可直飞的所有城市列表:

# 定义航班图,键为出发城市,值为可直飞到达的城市列表
flight_graph = {
    "北京": ["上海", "广州"],
    "上海": ["广州", "深圳"],
    "广州": ["深圳", "成都"],
    "深圳": ["成都"],
    "成都": []
}

def find_all_paths(current, end, graph):
    # 递归终止条件:当前节点就是终点,返回包含当前节点的路径
    if current == end:
        return [[current]]
    # 如果当前节点没有邻接节点,返回空列表
    if current not in graph or not graph[current]:
        return []
    all_paths = []
    # 遍历当前节点的所有邻接节点
    for neighbor in graph[current]:
        # 递归查找邻接节点到终点的所有路径
        sub_paths = find_all_paths(neighbor, end, graph)
        # 将当前节点拼接到每条子路径的前面
        for path in sub_paths:
            all_paths.append([current] + path)
    return all_paths

# 测试:查找北京到成都的所有航班路径
start = "北京"
end = "成都"
result = find_all_paths(start, end, flight_graph)
print(f"从{start}到{end}的所有路径:")
for path in result:
    print(" -> ".join(path))

代码逻辑解析

上述代码中,find_all_paths函数没有接收额外的路径参数,完全依靠递归返回的结果拼接路径。当递归到终点成都时,返回[["成都"]],上一层的深圳节点收到这个结果后,会拼接成["深圳", "成都"],再返回给广州节点,广州节点会分别处理深圳和成都两个邻接节点的返回结果,最终拼接出所有包含广州的路径,以此类推直到回到起点北京,汇总所有路径。

复杂度与适用场景

该方案的时间复杂度取决于航班图中的路径总数,假设总共有M条从起点到终点的路径,每条路径平均长度为K,那么时间复杂度为O(M*K)。空间复杂度主要来自递归调用栈,最大深度等于最长路径的长度,不需要额外开辟路径存储的空间,适合路径长度适中、不需要额外维护路径状态的场景。

需要注意的是,如果航班图中存在环(比如某个城市可以飞回之前的城市),该递归逻辑会陷入无限循环,因此使用前需要确保航班图是无环有向图,或者额外添加已访问节点的判断逻辑,但添加已访问判断就需要传入额外的参数,不符合无需额外参数的要求,所以本方案仅适用于无环的航班图场景。

递归函数航班图路径查找图遍历深度优先搜索路径回溯修改时间:2026-07-24 13:03:41

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。