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

请教如何通过递归实现斐波那契int数组返回与打印?

解决递归生成斐波那契数组的问题

Let's walk through the issues in your code first, then fix it with clear, working implementations!

你的代码里的核心问题

  • 数组越界错误:当你创建int[] result = new int[n]时,数组的有效索引范围是0到n-1,但你写了result[n] = ...,这会直接抛出ArrayIndexOutOfBoundsException。
  • 错误的递归调用语法:fibArray[n-1]是在试图访问一个名为fibArray的数组,但fibArray是你的方法名,正确的递归调用应该是fibArray(n-1)(用圆括号,不是方括号)。
  • 递归逻辑不成立:你不能直接把两个递归返回的数组相加,你需要先获取前一个长度的斐波那契数组,复制它的元素到新数组,再计算最后一位的值。
  • 边界条件不完善:当n=1时,你的代码会尝试给result[1]赋值,但数组长度只有1,这同样会触发越界错误。

修正方案1:递归构建数组

这个方案直接通过递归逐步扩展数组长度,每次基于前一个长度的数组生成新数组:

public int[] fibArray(int n) {
    // 处理n<=0的非法输入,返回空数组
    if (n <= 0) {
        return new int[0];
    }
    int[] result = new int[n];
    
    // 边界情况处理
    if (n == 1) {
        result[0] = 1;
    } else if (n == 2) {
        result[0] = 1;
        result[1] = 1;
    } else {
        // 递归获取n-1长度的斐波那契数组
        int[] prevArray = fibArray(n - 1);
        // 复制前n-1个元素到新数组
        System.arraycopy(prevArray, 0, result, 0, n - 1);
        // 计算新数组最后一位:前一个数组的最后两位之和
        result[n - 1] = prevArray[n - 2] + prevArray[n - 3];
    }
    return result;
}

修正方案2:辅助递归方法(更清晰)

把数组填充和斐波那契数计算分离,用一个辅助递归方法计算每个位置的数值,再填充到数组里:

public int[] fibArray(int n) {
    if (n <= 0) {
        return new int[0];
    }
    int[] result = new int[n];
    
    // 遍历数组,用辅助方法填充每个元素
    for (int i = 0; i < n; i++) {
        // 第i个索引对应第i+1个斐波那契数(因为我们的斐波那契从1开始)
        result[i] = calculateFib(i + 1);
    }
    return result;
}

// 辅助递归方法:计算第k个斐波那契数
private int calculateFib(int k) {
    if (k <= 2) {
        return 1;
    }
    return calculateFib(k - 1) + calculateFib(k - 2);
}

进阶:高效迭代实现(推荐)

递归生成斐波那契数会有大量重复计算,当n较大时效率很低。如果追求性能,迭代方式是最优选择:

public int[] fibArray(int n) {
    if (n <= 0) {
        return new int[0];
    }
    int[] result = new int[n];
    
    // 初始化前两位(如果存在)
    if (n >= 1) {
        result[0] = 1;
    }
    if (n >= 2) {
        result[1] = 1;
    }
    
    // 从第三位开始迭代计算
    for (int i = 2; i < n; i++) {
        result[i] = result[i - 1] + result[i - 2];
    }
    return result;
}

内容的提问来源于stack exchange,提问作者J. YYY

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:54:57