【问题标题】:Calculating PI recursively in C在 C 中递归计算 PI
【发布时间】:2018-03-23 01:57:26
【问题描述】:

我知道计算 PI 可能有更好的方法,但是因为我找到了莱布尼茨公式:

我决定使用递归在 C 中实现它:

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

当我调用该函数时,我总是得到 4.000000,这意味着它仅适用于数字 1;每隔一个数字都会给我同样的结果。

我想知道为什么这个解决方案不能正常工作。我试过在纸上写下不同数字的每一步,其背后的逻辑似乎是正确的。

编辑: 除了答案中提供的内容(谢谢!)之外,似乎 (1/(double)(2*n-1)) 而不仅仅是 (1/(2*n-1)) 也解决了这个问题。

【问题讨论】:

  • 这个公式不适合递归算法,使用迭代,而不是递归
  • 顺便说一句,使用像pow() 这样的表达式是非常不理想的
  • 不幸的是,由于我正在学习算法和数据结构,所以我必须知道如何使用递归。我已经决定这个公式可能是最好的实施方式。如果除了网络抓取之外我不必使用递归,我会很高兴。

标签: c recursion pi


【解决方案1】:

错误完全在于这个词:

(1/(2*n-1))

假设在本次迭代中 n 恰好是 3:

1 / (2 * 3 - 1) == 1 / 5 == 0

(我会让你弄清楚为什么结果是 0,而你认为​​它应该是 0.2)


提示 #1:1.0 和 1 有什么区别?

提示 #2:如何通过在表达式中添加一个字符来修复表达式:.??

1 的类型为 int,1.0 的类型为 double
将表达式更改为(1./(2*n-1))

【讨论】:

  • 你至少应该给个提示:)
  • 谢谢,我想通了。将其更改为 (1/(double)(2*n-1)),现在可以使用了。
猜你喜欢
  • 2014-04-12
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多