Java斐波那契数列fibr方法计算异常,请求排查错误原因
解决斐波那契递归方法计算错误的问题
看起来你的fibr方法应该是想用分治优化的方式计算斐波那契数,但后面的奇偶分支逻辑出错了,导致偶数项的计算结果完全偏离预期。咱们一步步理清楚:
首先明确正确的斐波那契数值
你调用的几个参数对应的正确结果是:
fibr(8)→ 21fibr(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
相关产品推荐
相关产品推荐

