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++不久,谢大神。 展开
#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++不久,谢大神。 展开
展开全部
递归次数过多,确实会造成堆栈溢出。
当需要循环次数过多的时候,确实不适合使用递归程序了,其实这个一次循环就可以解决。
#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。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询