C++ Ошибка рекурсивной функции

  • Автор темы VarkrafT
  • Дата начала
V

VarkrafT

Гость
#1
Здравствуйте. Вот программа с использованием рекурсивной функции.
s1,s2,s3,s4,s5-считают суммы членов ряда
next- вычисляет очередной член ряда
stx-считает степень х
х=0.1; |x|<1; шаг х=0.1
Вычисляться должен арктангенс(х)
s1,s2-правильно считают, а s3,s4,s5-нет.
Подскажите где ошибка пожалуйста.

[codebox]#include<math.h>
#include<conio.h>
#include<iostream.h>
#include<iomanip.h>
#include<fstream.h>
#include<stdlib.h>

ofstream fout;
double p=3.141592653589793;
float stx(float x, int n)
{if(x==0) return(0);
else if(n==0)return(1);
else if(n==1) return (x);
else return(x*stx(x,n-1));
}

float next(float x,int n)
{
return atan(x/sqrt(1-stx(x,2)));
}

typedef float(*func)(float,int);

float s1(float x,float e)
{
float a=((2*1-1)*stx(x,2*1+1))/((2*1)*(2*1+1)),s=p/2-x;
int n=1;
while (fabs(a)>e)
{s-=a; a*=((2*n-1)*stx(2*n+1,2)*stx(x,2))/((2*n+2)*(2*n+3));
n++;
}
return(s+a);
}

float s2(float x,float e)
{ float a=a=((2*1-1)*stx(x,2*1+1))/((2*1)*(2*1+1)),s=p/2-x;
int n=1;
do
{s-=a; a*=(((2*n-1)*stx(2*n+1,2)*stx(x,2))/((2*n+2)*(2*n+3)));
n++;
}
while (fabs(a)>e);
return(s+a);
}

float s3(int n,float x,float e, func fn)
{
float f=fn(x,n),s=p/2;
while(fabs(f)>e)
{s-=f;n++;f=fn(x,n);}
return(s+f);
}

float s4(int n,float x,float e,func fn)
{
float f=fn(x,n),s=p/2;
do {s-=f;n++;f=fn(x,n);}
while(fabs(f)>e);
return(s+f);
}

float s5(int n,float x, float e,func fn)
{
float f=fn(x,n);
if(fabs(f)<e)return f;
else return(f+s5(n+1,x,e,fn));
}

void main()
{float e=1.e-5;
fout.open("15.res");
if(!fout)
{cout<<"oshibka otkrbItij fajla rezylbtatov";exit(0);}
fout<<"\t\t\tRezylbtatbI dlj e="<<e<<'\n'
<<"|-----|----------|----------|----------|----------|----------|----------|"<<'\n'
<<"| x | arccos | s1 | s2 | s3 | s4 | s5 |"<<'\n'
<<"|-----|----------|----------|----------|----------|----------|----------|";
for(float x=0.1; x<1; x+=1)
{
fout<<endl<<'|'<<setw(3)<<x<<setw(3)<<'|'<<setw(10)<<acos(x)<<'|'
<<setw(10)<<s1(x,e)<<'|'<<setw(10)<<s2(x,e)<<'|'
<<setw(10)<<s3(1,x,e,next)<<'|'<<setw(10)<<s4(1,x,e,next)<<'|'
<<setw(10)<<s5(1,x,e,next)<<'|';
}
fout<<'\n'<<"|-----|----------|----------|----------|----------|----------|----------|";
fout.close();
}[/codebox]