判断用于计算400万以内偶数斐波那契数之和的if条件是否正确?
问题分析与修复方案
你的代码存在几个关键问题,直接导致结果错误:
1. 求和函数未返回计算结果
evenfibonacci()函数末尾缺少return result;语句,调用该函数根本无法获取最终的求和结果,这是最核心的错误。
2. 递归计算斐波那契数效率极低且重复计算
循环中多次调用fibonacci(k)(判断范围、判断奇偶、累加操作各调用一次),每次调用都会重新递归计算一遍数列,不仅运行速度极慢,还会浪费大量系统资源。
3. int类型存在潜在溢出风险
虽然400万以内的斐波那契数未超出32位int的最大值(约21亿),但如果后续扩展计算范围很容易溢出,建议改用long类型更稳妥。
修复后的代码示例
高效迭代版(推荐)
直接在求和过程中迭代计算斐波那契数,同时判断偶数并累加,完全避免重复计算:
long evenFibonacciSum() { long sum = 0; long a = 1; // 第1项 long b = 2; // 第2项 // 先处理初始偶数项2 if (b <= 4000000) { sum += b; } long next; while ((next = a + b) <= 4000000) { if (next % 2 == 0) { sum += next; } // 更新斐波那契数列的前两项 a = b; b = next; } return sum; }
递归优化版(不推荐,仅作参考)
保留递归逻辑,但通过缓存避免重复计算,同时修复返回值问题:
// 缓存数组,存储已计算的斐波那契数 long fibCache[100] = {0}; long fibonacci(int k) { if (k == 1 || k == 2) { return k; } // 缓存命中直接返回 if (fibCache[k] != 0) { return fibCache[k]; } // 计算并存入缓存 fibCache[k] = fibonacci(k-1) + fibonacci(k-2); return fibCache[k]; } long evenfibonacci() { long result = 0; int k = 1; long currentFib; while ((currentFib = fibonacci(k)) <= 4000000) { if (currentFib % 2 == 0) { result += currentFib; } k++; } return result; // 必须返回结果 }
正确结果
400万以内的偶数斐波那契数之和为4613732。
内容的提问来源于stack exchange,提问作者giuli0110
相关产品推荐
相关产品推荐

