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

C语言递归实现莱布尼茨公式计算PI失效问题求助

问题分析与解决方案

嘿,我一眼就揪出你代码里的核心问题啦!咱们一步步拆解来看:

导致结果失效的关键原因:整数除法陷阱

你的递归函数里,这行代码是罪魁祸首:

1/(2*n-1)

在C语言中,两个整数做除法时会执行整数除法——直接舍弃小数部分,只保留整数结果。当n>1时,2*n-1的值肯定大于1(比如n=2时是3,n=3时是5),这时候1/(2*n-1)的整数除法结果全都是0!

这就意味着,除了n=1的情况,后续每一层递归添加的项都是:

4*pow(-1,n+1)*0 = 0

不管你传入多大的n,最终结果都是pi(1)返回的4.0,自然所有n>1的结果都一模一样。

快速修复方案

只需要把整数1改成浮点数1.0,强制触发浮点数除法就行:

double pi(int n){ 
    if(n==1)return 4; 
    return 4*pow(-1,n+1)*(1.0/(2*n-1))+pi(n-1); 
}

这样1.0/(2*n-1)会得到正确的小数结果(比如n=2时是1.0/3≈0.3333),递归累加的每一项都会生效,计算结果就能随着n的增大逐渐逼近π了。

额外优化小建议

另外,用pow(-1, n+1)计算交替符号有点浪费性能,毕竟我们只需要来回切换正负。可以改成用辅助函数传递符号,避免频繁调用pow:

double pi_helper(int n, double sign) {
    if(n == 0) return 0;
    return sign * 4.0/(2*n - 1) + pi_helper(n-1, -sign);
}

double pi(int n) {
    return pi_helper(n, 1.0);
}

这样代码效率会更高一些~

内容的提问来源于stack exchange,提问作者randomuser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:24:50