Рекурсивное приближение ряда Син Тейлора - PullRequest
0 голосов
/ 28 марта 2019

Мне нужно немного разобраться в моем рекурсивном методе вычисления ряда грехов Тейлора, который не работает должным образом.Метод вызывает два других рекурсивных метода, которые являются рекурсивным методом pow и рекурсивным факториальным методом.Я сравнил свои выводы с методом итеративного греха, который дал мне правильное решение.Чего не хватает в моем методе рекурсивного греха?

Приближение греха (x) = x - x ^ 3/3!+ х ^ 5/5!-x ^ 7/7! + ...

public class SinApprox
    {
        public static void main (String [] args)
        {
            Out.println(sinx(1, 1, 2, 1, 1, 0, 1));
            Out.print(sinIT(2));
        }

    static double sinIT(double x)
    {
        double sin = 0;
        double a = x;
        double b = 1;
        double term = a/b;
        double vz = 1;
        double i = 1;

    while(term > 0.000001)
    {
        i = i +2;
        sin = sin + (term*vz);
        a= rekursivPow(x,i);
        b = rekursivN(i);
        term = a/b;
        vz = -1 * vz;
    }
    return sin;
}

static double rekursivN(double n)
{
    if(n==1)
    {
        return 1;
    }
    return n * rekursivN(n-1);
}

static double rekursivPow(double x , double y)
{
    if(y  == 1)
    {
        return x ;
    }
    return x * rekursivPow(x , y  - 1);
}

static double sinx(double i ,double n, double x, double y, double vz, double sum, double pow)
{


    double term = pow / n;

    if(term > 0.000001)
    {
        sum = sum + (term * vz);
        vz = -1 * vz;
        i = i +2;
        n = rekursivN(i);
        y = y +2;
        pow = rekursivPow(x ,y);

        return sinx(i, n, x , y , vz, sum, pow);
    }
    return sum;


   }
}

1 Ответ

1 голос
/ 28 марта 2019

Первым шагом было бы написать функцию таким образом, чтобы прояснить рекурсивные отношения (вы не можете написать код для непонятного), поэтому не начинайте с этого:

sin(x)= x - x^3/3! + x^5/5! -x^7/7!+ ...

Но вместо этого спросите «как я могу сделать так, чтобы все эти термины с x выглядели одинаково»:

sin(x)= x^1/1! - x^3/3! + x^5/5! + ...

Хорошее начало, но если мы вернемся, то, что мы действительно ищемэто то, что only вычисляет один из этих терминов, а затем вызывает себя с обновленными аргументами для вычисления следующего термина.В идеале мы хотим что-то вроде:

doThing(args) {
  return simpleComputation() + doThings(updatedargs);
}

А потом рекурсия сделает все остальное.Итак, давайте сначала удостоверимся, что нам нужно иметь дело только с + вместо сочетания + и -:

sin(x)= (-1)^0 * x^1/1! + (-1)^1 * x^3/3! + (-1)^2 * x^5/5! + ...

И теперь у вас есть что-то, что вы можете фактически выразить как рекурсивныйотношение, потому что:

sin(x,n) {
  return (-1)^n * x^(2n+1) / (2n+1)! + sin(x, n+1);
}

С помощью функции «ярлык»:

sin(x) {
  return sin(x,0); 
}

И на этом подсказки останавливаются, все остальное вы сможете реализовать самостоятельно.Пока вы помните, остановите рекурсию, потому что серия Тейлора бесконечна, а компьютерные программы и ресурсы - нет.

...