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

Java斐波那契数列fibr方法计算异常,请求排查错误原因

解决斐波那契递归方法计算错误的问题

看起来你的fibr方法应该是想用分治优化的方式计算斐波那契数,但后面的奇偶分支逻辑出错了,导致偶数项的计算结果完全偏离预期。咱们一步步理清楚:

首先明确正确的斐波那契数值

你调用的几个参数对应的正确结果是:

  • fibr(8) → 21
  • fibr(9) → 34(你的输出是对的,说明奇数分支逻辑没问题)
  • fibr(10) → 55

你的输出里偶数项全错,问题肯定出在偶数分支的公式实现上。

斐波那契分治的正确公式

分治法优化斐波那契的核心是利用以下数学规律:

  • 当n为奇数(n=2k+1):F(n) = F(k+1)² + F(k)²
  • 当n为偶数(n=2k):F(n) = F(k) * (2*F(k+1) - F(k))

修正后的完整代码

我把正确的分治实现写出来,你可以对比自己的代码找差异:

public static int fibr(int n) {
    if(n < 0) return 0;
    if(n == 0) return 0;
    if(n == 1 || n == 2) return 1;
    
    if(n % 2 == 1) { // 处理奇数情况
        int k = (n - 1) / 2;
        int fk = fibr(k);
        int fk1 = fibr(k + 1);
        return fk1 * fk1 + fk * fk;
    } else { // 处理偶数情况
        int k = n / 2;
        int fk = fibr(k);
        int fk1 = fibr(k + 1);
        return fk * (2 * fk1 - fk);
    }
}

验证修正后的结果

调用你那三个测试用例:

  • fibr(8):计算k=4,F(4)=3,F(5)=5 → 3*(2*5-3)=3*7=21(正确)
  • fibr(9):计算k=4,F(4)=3,F(5)=5 → 5²+3²=25+9=34(正确)
  • fibr(10):计算k=5,F(5)=5,F(6)=8 → 5*(2*8-5)=5*11=55(正确)

如果你不需要分治优化

如果只是小范围的n计算,普通递归逻辑更简单,不容易出错:

public static int fibr(int n) {
    if(n < 0) return 0;
    if(n == 0) return 0;
    if(n == 1 || n == 2) return 1;
    return fibr(n-1) + fibr(n-2);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:33:27