CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com

# Thread: Recursion Help

1. Junior Member
Join Date
Jan 2010
Posts
4

## Recursion Help

I cant get this function to recursively call itself what do i have in wrong i go through debugger and it just slides right over the recursive call

double recursive (double left, double permaRight,double permaTol, double right, double tol)
{
double leftArea, rightArea, fullArea, areaAB, finalArea=0, recursiveAreaDifference=0, midpointer;
leftArea = funcArea(F(left), F(midpoint(left,right)), midpoint(left,right),left);
rightArea = funcArea(F(right), F(midpoint(left,right)), midpoint(left,right),right);
fullArea = funcArea(F(left),F(right),(midpoint(left,right)*2),0);
areaAB = (leftArea +rightArea);
midpointer = midpoint(left,right);
finalArea += areaAB;

if(left == permaRight)//if the changing left bound = the user defined right limit
{
return finalArea; //progressive addition of the area
}

if((areaAB) <= ((fullArea + tol)||(fullArea -tol)))
{
permaTol -( fabs(areaAB - fullArea));
recursiveAreaDifference += fabs((areaAB - fullArea));
left = right;
right = permaRight;
return (recursive(left,permaRight,permaTol, right, tol));
}

else
{
return recursive(left,permaRight, permaTol, midpoint(left,right), tol/2);
}

2. Junior Member
Join Date
Jan 2010
Posts
4

## Full Program

#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;

double F(double x);
//PRE: none.
//POST: returns F(x).
double midpoint(double a, double b, int c=1);
double funcArea(double a, double b, double midpoint, double limit);
double recursive(double left, double permaRight,double permaTol, double right, double tol);

int main()
{
ofstream fout;//opens output file
fout.open("Output.txt");//designates output file

if(fout.fail())
{
cerr << "output file failed to open" <<endl;

}

///this section just deals with user input of variables to be manipulated
double left = 0, right = 0, usertol, tol = 0, permaRight =0;

cout << "Please enter left lateral limit." << endl;
//cin >> left;

left = 0; //testing conditions

fout << "Left limit is " << left << endl;
cout << "Left limit is " << left << endl;

cout << "Please enter right lateral limit." <<endl;
//cin >> right;

right = 4; ///testing conditions
permaRight = right;// will keep the right limit stored for the recursive function to check against
fout << "Right limit is " << right << endl;
cout << "Right limit is " << right << endl;

cout << "Please enter area accuracy tolerance." <<endl;
//cin >> usertol;

usertol = .1;
tol = usertol/2; ///testing conditions

fout << "Tolerance within " << tol <<endl;
cout << "Tolerance within " << tol <<endl;

double leftArea =0, rightArea=0, fullArea=0, areaAB=0;
leftArea = funcArea(F(left), F(midpoint(left,right)), midpoint(left,right),left);
rightArea = funcArea(F(right), F(midpoint(left,right)), midpoint(left,right),right);
fullArea = funcArea(F(left),F(right),(midpoint(left,right)*2),0);

fout << "Midpoint " << midpoint(left,right)<<endl;
fout << "F(left) "<< F(left)<<endl;
fout << "F(midpoint) "<< F(midpoint(left,right))<<endl;
fout << "F(right) "<< F(right)<<endl;
fout << "Area of left " << leftArea << endl;
fout << "Area of right " << rightArea <<endl;
fout << "Full area" << fullArea <<endl;

fout << "Area estimation" << recursive(left,permaRight,tol ,right,tol)<<endl;

fout.close();

return 0;
}

double F(double x)
{
double z;
z = pow(x,3)+2;
return z;
}
double midpoint(double a, double b, int c)
{
double z;
z=(a+b)/(pow((double)2,c));
return(z);
}
double funcArea(double a, double b, double midpoint, double limit)
{
double z;
z =((a+b)/2)*(fabs(midpoint - limit)); // a = f(right or left limit) b= f(midpoint)
//fabs = absolute value of the midpoint
//limit could be left or right the absolute value function will allow it to work with either
return z;
}

double recursive(double left, double permaRight,double permaTol, double right, double tol)
{
double leftArea, rightArea, fullArea, areaAB, finalArea=0, recursiveAreaDifference=0, midpointer;
leftArea = funcArea(F(left), F(midpoint(left,right)), midpoint(left,right),left);
rightArea = funcArea(F(right), F(midpoint(left,right)), midpoint(left,right),right);
fullArea = funcArea(F(left),F(right),(midpoint(left,right)*2),0);
areaAB = (leftArea +rightArea);
midpointer = midpoint(left,right);
finalArea += areaAB;

if(left == permaRight)//if the changing left bound = the user defined right limit
{
return finalArea; //progressive addition of the area
}

if((areaAB) <= ((fullArea + tol)||(fullArea -tol)))
{
permaTol -( fabs(areaAB - fullArea));
recursiveAreaDifference += fabs((areaAB - fullArea));
left = right;
right = permaRight;
return (recursive(left,permaRight,permaTol, right, tol));
}

else
{
return (recursive(left,permaRight, permaTol, (midpoint(left,right)), (tol/2)));
}
}

3. Junior Member
Join Date
Jan 2010
Posts
4

## Re: Recursion Help

it executes but horribly need some help if possible

4. Member
Join Date
Jul 2009
Posts
37

## Re: Recursion Help

Easy please
Put them in code tags then errors will be probably found easier

#### Posting Permissions

• You may not post new threads
• You may not post replies
• You may not post attachments
• You may not edit your posts
•

Click Here to Expand Forum to Full Width

On-Demand Webinars (sponsored)