C - 递归程序来计算Pi用完递归堆栈?

时间:2014-03-09 05:39:04

标签: c recursion

我的程序代码看起来像这样

#include <iostream>
#include <cmath>
using namespace std;

double pi (double);

int main()
{
 cout << "Enter n to value of pi: "; double n; cin>>n;
 cout << pi(n) << endl;

 return 0;
}


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

除了它在C中(我只是改变了包含语句,scanf,printf)。

如果我为epsilon

输入0.00001或任何更少,程序会一直崩溃

其中epsilon的意思是(我只是在该等式中重新排列epsilon以找到n,然后使用n作为递归的参数)http://puu.sh/7ot1P.png

我认为这是因为它进行了太多的递归。有什么办法解决吗?

BTW当我在unix服务器上运行时,错误是分段错误(核心转储)

3 个答案:

答案 0 :(得分:2)

pi()需要加倍,你给int

答案 1 :(得分:0)

  1. n的类型应为int。
  2. 我认为n应该大于或等于1.
  3. 当n <1时,递归函数pi()需要添加结束条件。

答案 2 :(得分:0)

正确地假设您递归太深,因此会出现堆栈溢出。在我的机器上(Linux Mint 16 64位),堆栈的最大大小为8MB,并且您的代码运行良好,直到调用大约。 pi(230000)

要解决此问题,您有3个选项:

  • 使用命令ulimit -s size_in_kB增加堆栈的大小。这仅适用于基于Unix的系统,并且当您使用过大的堆栈大小值时会导致问题。
  • 将近似算法从递归算法更改为迭代算法。
  • 使用更快收敛的算法,请参阅https://en.wikipedia.org/wiki/Approximations_of_%CF%80了解一些想法