c++用递归求pi,出现堆栈溢出

#include<iostream.h>#include<iomanip.h>#include<math.h>voidmain(){doublesum(double,do... #include<iostream.h>
#include<iomanip.h>
#include<math.h>
void main()
{double sum(double,double,int);
int s=1;
double m,n=1,p=0;
m=sum(p,n,s);
m=m*4;
cout<<"pi="<<setiosflags(ios::fixed)<<setprecision(6)<<m<<endl;
system("pause");
}

double sum(double p,double n,int s)
{if(fabs(s/n)>1e-7)
{return s/n+sum(p,n+2,-s);}
else return 0;
}
如何改进这个程序,使之不溢出,或者提高精度?尽量简单,我刚学c++不久,谢大神。
展开
 我来答
bhtzu
2013-11-02 · TA获得超过1.1万个赞
知道大有可为答主
回答量:8088
采纳率:85%
帮助的人:4253万
展开全部

递归次数过多,确实会造成堆栈溢出。

当需要循环次数过多的时候,确实不适合使用递归程序了,其实这个一次循环就可以解决。

#include <stdio.h>
#include<math.h>
int main() 
{
    double m1=1,sum=0;
    for(int n1=0;fabs(m1=((n1*2+2)%4-1.0)/(2*n1+1.0))>1e-8;n1++,sum += 4*m1);

    printf("%.8f\n",sum);
    return 0 ;
}
更多追问追答
追问
大神,难道没有方法改进这个递归吗?用循环着我我会,当我在想能不能用递归去做它。
追答

系统为每个线程都建立一个默认堆栈,大小为1M。这个堆栈是供函数调用时使用,线程内函数里的各种静态变量都是从这个默认堆栈里分配的,而递归也是用这个堆栈。

因为C++程序包含了很多库函数(循环包含的),因此堆栈里面上来就会占用大部分,留给递归的不多,也就200~300k左右的样子。

而递归中,函数本身加上临时变量和常量,每次占用大概上百字节,也就是,你递归循环也就是几千上万次递归就会造成堆栈溢出。

要增加可递归次数,一个是优化库包含,减少外来占用,一个是优化程序,减少递归中的临时变量和常量。再有,就是修改默认堆栈大小(这个需要语言环境支持)。

但即使这些都做了,递归也不可能很多次,也就是说,对于求π值,达不到循环所达到的精度。

#pragma comment(linker,"/STACK:102400000,1024000")

第一个值是堆栈的保留空间,第二个值是堆栈开始时提交的物理内存大小。这是将堆栈改变为100M。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式