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
相关产品推荐
相关产品推荐

