递归与非递归Fibonacci函数结果不一致问题求助
斐波那契计算器结果不一致问题排查
你的递归版本代码是正确的,问题出在非递归版本的循环逻辑上,导致它返回的是F(n+1)而非F(n)。
正确的斐波那契数列值参考
按标准定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2),因此F(7)的正确结果是13——你的递归版FibRec(7)返回13是对的,非递归版Fib(7)返回的21实际是F(8)的值。
非递归代码的问题分析
看你非递归代码里的循环条件:
for (int i = 0; i <= n-1; i++)
当n=7时,循环会执行7次(i从0到6),但从F(0)和F(1)推导到F(7)只需要6次迭代:
- 第1次迭代:得到F(2)=1
- 第2次迭代:得到F(3)=2
- ...
- 第6次迭代:得到F(7)=13
- 第7次迭代:额外计算出F(8)=21,这就是你得到的错误结果
修复后的非递归代码
以下两种方式都能解决问题,选一种即可:
方式1:修改循环条件
public static int Fib(int n) { if (n == 0) { return 0; } if(n == 1) { return 1; } int a = 0; int b = 1; int res = 0; // 循环次数调整为n-2次,避免多算一次 for (int i = 0; i < n-1; i++) { res = a + b; a = b; b = res; } return res; }
方式2:更直观的循环逻辑
从i=2开始循环到n,直接计算对应位置的斐波那契数,逻辑更清晰:
public static int Fib(int n) { if (n == 0) { return 0; } if(n == 1) { return 1; } int a = 0; int b = 1; for (int i = 2; i <= n; i++) { int temp = a + b; a = b; b = temp; } return b; }
验证结果
修复后调用Fib(7)会返回正确的13,和递归版本结果一致。
内容的提问来源于stack exchange,提问作者Tuy
相关产品推荐
相关产品推荐

