C语言递归实现阶乘分数累加求和问题排查
问题分析与代码修正
你的代码目标是计算自然常数e的近似值(公式:$1/0! + 1/1! + 1/2! + ... + 1/n!$),但当前存在两个核心问题导致结果错误:
- 仅累加了最后一项$1/n!$,而非从$1/1!$到$1/n!$的所有项
- 阶乘函数
fact未处理$n=0$的情况(0!的正确值为1,传入0会触发无限递归)
当输入n=5时,预期结果是$1 + 1 + 0.5 + 0.166666... + 0.041666... + 0.008333... = 2.7166666667$,但你的代码只计算了$1 + 1/5! = 1.008333$,所以输出不符合预期。
修正方案1:保留递归阶乘,补充循环累加
先修复阶乘函数对n=0的处理,再通过循环累加每一项:
#include <stdio.h> float fact(int n); int main() { int n; float e = 1.0; // 初始值对应1/0! printf("Enter length: "); scanf("%d", &n); // 循环累加1/1! 到 1/n! 的所有项 for (int i = 1; i <= n; i++) { e += 1.0 / fact(i); } printf("\nThe value of 'e' is : %.10f\n", e); return 0; } float fact(int n) { // 处理0!的情况,0! = 1 if (n == 0 || n == 1) return 1; else return n * fact(n - 1); }
修正方案2:迭代优化(更高效)
递归计算阶乘会重复计算多个中间值(比如计算5!时会重复计算4!、3!等),可以用迭代方式直接维护当前阶乘值,避免冗余计算:
#include <stdio.h> int main() { int n; float e = 1.0; float current_fact = 1.0; // 初始为0! = 1 printf("Enter length: "); scanf("%d", &n); for (int i = 1; i <= n; i++) { current_fact *= i; // 每次迭代得到i! = (i-1)! * i e += 1.0 / current_fact; } printf("\nThe value of 'e' is : %.10f\n", e); return 0; }
运行修正后的代码,输入n=5时,会输出预期的2.7166666667。
内容的提问来源于stack exchange,提问作者Ceallaigh
相关产品推荐
相关产品推荐

