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

如何用递归函数实现树形JSON字典的DFS?及外部变量高效赋值方法

问题2:递归DFS中外部变量赋值无效的高效解决办法

你遇到的问题本质是Python的参数传递机制:当你在函数内部给result重新赋值时,只是修改了函数内部的局部变量,并不会影响外部作用域的result。下面给你几种高效的解决方案,按推荐程度排序:

方法1:让递归函数直接返回目标节点(最推荐)

这是最符合递归设计思想的方式,找到目标节点后立即返回,无需依赖外部变量,效率最高且代码最简洁。

示例代码

def dfs_find_node(json_tree, target_index):
    # 找到目标节点,直接返回该节点对象
    if json_tree['index'] == target_index:
        return json_tree
    
    # 没有子节点,返回None表示未找到
    if 'children' not in json_tree:
        return None
    
    # 遍历所有子节点,递归查找
    for child in json_tree['children']:
        found_node = dfs_find_node(child, target_index)
        # 如果子递归找到节点,直接向上返回,终止后续遍历
        if found_node is not None:
            return found_node
    
    # 所有子节点都遍历完仍未找到,返回None
    return None

# 使用示例
target_node = dfs_find_node(sample_tree, 4)
if target_node:
    print(f"成功找到目标节点:{target_node}")
else:
    print("未找到指定index的节点")

这种方式的优势在于:一旦找到目标就终止递归,避免不必要的遍历,而且不需要维护外部状态,代码可读性极强。

方法2:使用可变对象承载结果(比如列表)

如果你的场景需要在递归中收集多个结果,或者必须依赖外部变量,可以用列表这类可变对象作为参数。因为可变对象的修改会直接反映到外部。

示例代码

def dfs_find_node_with_list(json_tree, target_index, result_list):
    if json_tree['index'] == target_index:
        # 修改列表的第一个元素,外部能直接获取到这个变化
        result_list[0] = json_tree
        return
    
    if 'children' not in json_tree:
        return
    
    for child in json_tree['children']:
        # 如果已经找到目标,提前终止递归
        if result_list[0] is not None:
            return
        dfs_find_node_with_list(child, target_index, result_list)

# 使用示例
result = [None]  # 用列表承载结果
dfs_find_node_with_list(sample_tree, 5, result)
if result[0]:
    print(f"成功找到目标节点:{result[0]}")
else:
    print("未找到指定index的节点")

方法3:使用闭包或类封装状态(复杂场景适用)

如果需要在递归中维护更多状态(比如遍历路径、计数等),可以用闭包捕获外部变量,或者用类来封装逻辑。

闭包示例

def find_node_closure(json_tree, target_index):
    target = None
    
    def dfs(node):
        nonlocal target  # 声明使用外部函数的变量
        if node['index'] == target_index:
            target = node
            return
        if 'children' in node:
            for child in node['children']:
                if target is not None:
                    return
                dfs(child)
    
    dfs(json_tree)
    return target

# 使用示例
target_node = find_node_closure(sample_tree, 3)
print(f"成功找到目标节点:{target_node}")

内容的提问来源于stack exchange,提问作者Sheffield

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:55:03