#include #include double f (double x){ /* (x - 5.0) * (x - 3.0) * (x + 7.0) */ return (x*x*x - x*x - 41.0 * x + 105.0); } int sameSign(double x, double y){ return x * y >= 0.0; } double middleOf(double x, double y){ return x + (y - x)/2; } int isSmallNumber(double x){ return (fabs(x) < 0.0000001); } double findRootBetween(double l, double u){ if (isSmallNumber(f(middleOf(l,u)))) return middleOf(l,u); else if (sameSign(f(middleOf(l,u)), f(u))) return findRootBetween(l, middleOf(l,u)); else if (!sameSign(f(middleOf(l,u)), f(u))) return findRootBetween(middleOf(l,u),u); else exit (-1); } int main (void){ double x, y; int numbers; printf("RECURSIVE ROOT FINDING\n\n"); do{ printf("%s","Find a ROOT between which numbers: "); numbers = scanf("%lf%lf", &x, &y); if (numbers == 2 && !sameSign(f(x),f(y))){ double solution = findRootBetween(x,y); printf("\nThere is a root in %lf\n", solution); } else if (numbers == 2 && sameSign(f(x),f(y))) printf("\nf must have different signs in %lf and %lf\n", x, y); else if (numbers != 2) printf("\nBye\n\n"); } while (numbers == 2); }