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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:35:17