求助急!!帮忙看看这个程序!

来源:百度知道 编辑:UC知道 时间:2024/06/17 05:42:49
编写程序,直至下面的函数两次计算之差小于10^-5;
y=arctan cos arctan cos……arctan cos(PI/6);PI=3.14159;

用递归,怎么不出结果的!郁闷啊,高手帮忙挑挑错!谢了!!
我编的:
#include <stdio.h>
#include<math.h>
#define PI 3.14159
#define eps 1e-5
void main()
{
double x;int n=2;
double s;
double cacl(double x,int n);
do{
n++;
s=cacl(PI/6,n);
}while(fabs(cacl(PI/6,n)-cacl(PI/6,n-1))>eps);

printf("%f",s);
}

double cacl(double x,int n){
double ac(double x);
if(n==1) return ac(x);
else return cacl(cacl(x,n),n-1);
}

double ac(double x){
return atan(cos(x));
}

1.错误在你的递归函数。
2.
double cacl(double x,int n){
double ac(double x);
if(n==1) return ac(x);
else return cacl(cacl(x,n),n-1);
}
第一次调用caal函数时,x的值是0.52359833333333328,n的值是3,因为n是3不等于1所以执行else语句,return cacl(cacl(x,n),n-1); 这时执行cacl(cacl(x,n),n-1); 执行cacl(x,n),这时x的值还是0.52359833333333328,n的值还是3,可以看出,每次递归调用x和n的值都没有变,如此这样下去会把程序的栈空间占完,程序结束,什么也不会输出

不用调用cacl函数,上面几楼已经说的很清楚。直接改为一下代码就可以啦
#include <stdio.h>
#include<math.h>
#define PI 3.14159
#define eps 1e-5
void main()
{
double x;int n=2;
double s; double ac(double x,int n);

do{
n++;
s=ac(PI/6,n);
}while(fabs(ac(PI/6,n)-ac(PI/6,n-1))>eps);

printf("%f\n",s);

}

double ac(double x,int n){
int i;
for(i=1;i<=n;i++)
x=atan(cos(x));
return x;
}
输出的结果是:0.666238
或者
cacl(cacl(x,n-1),n-1);

程序死循环了,你开始n=2;
第一轮循环 n++;