【问题标题】:C - recursive program to calculate Pi runs out of recursion stacks?C - 计算 Pi 的递归程序用完递归堆栈?
【发布时间】:2014-04-12 07:10:50
【问题描述】:

我的程序代码如下所示

#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 中(我实际上只更改了 include 语句、scanf、printf)。

如果我输入 0.00001 或更少的 epsilon,程序会一直崩溃

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

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

顺便说一句,当我在 unix 服务器上运行它时,错误是分段错误(核心转储)

【问题讨论】:

  • 应该nint 还是double
  • 应该是双倍的,抱歉。我的代码修复了小细节,我的代码是 C 语言,而不是 C++。 “重复问题”对C有用吗?我不确定如何将他们的小代码段合并到我的 C 程序中。
  • @user3397709:您问题中的代码是 C++,而不是 C。
  • @user3397709 你为什么不发布你的代码?为什么要发布无关的 sn-p?

标签: c recursion


【解决方案1】:

pi() 期望双倍,你给int

【讨论】:

  • 嘿,我修好了,抱歉。但这不是问题,因为这适用于 epsilon 的中等值(最高 0.001)。任何更少的 (0.0001) 崩溃。
  • 这没有问题,因为 int 隐式转换为 double
【解决方案2】:
  1. n 的类型应该是 int。
  2. 我认为 n 应该大于或等于 1。
  3. 递归函数 pi() 在 n

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-13
      • 2020-05-25
      • 2015-09-12
      • 2017-01-20
      • 1970-01-01
      • 2014-07-14
      • 2013-08-27
      • 2011-01-19
      相关资源
      最近更新 更多