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

如何在含递归的循环中返回对象?解决返回null问题

问题分析与修复

核心问题

  1. 递归返回值未传递:你在forEach里调用递归,但没有接收或返回子递归的结果。就算子递归找到了目标对象,上层方法也无法获取到,最终还是返回null。
  2. 冗余的do-while循环:代码里的do-while循环完全没必要,flag初始为false,循环只会执行一次,对逻辑没有任何帮助。
  3. 未处理无限嵌套(循环引用):如果子Budget列表中存在对父Budget的引用,会导致无限递归,最终栈溢出。

修复后的代码

private static Budget recursion(Budget budget, long sec, Set<Budget> visited) {
    // 检查当前节点是否已访问,防止循环引用导致无限递归
    if (visited.contains(budget)) {
        return null;
    }
    visited.add(budget);

    // 匹配到目标直接返回
    if (Objects.equals(budget.getSection(), sec)) {
        return budget;
    }

    // 遍历子Budget,递归查找,找到结果立即返回
    for (Budget subBudget : budget.getSubBudget()) {
        Budget found = recursion(subBudget, sec, visited);
        if (found != null) {
            return found;
        }
    }

    return null;
}

// 对外调用的入口方法,初始化已访问集合
private static Budget findBudget(Budget root, long sec) {
    return recursion(root, sec, new HashSet<>());
}

修复说明

  • 传递递归返回值:遍历子Budget时接收递归调用的结果,一旦找到非null的目标对象,立刻向上层返回,确保结果能传递到最外层。
  • 移除冗余循环:用清晰的线性递归逻辑替代无意义的do-while结构。
  • 防无限递归:通过Set<Budget>记录已访问过的对象,避免循环引用引发的栈溢出问题。

调用时直接使用findBudget(rootBudget, targetSec)即可。

内容的提问来源于stack exchange,提问作者Александр Берестов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 17:52:12