Возникли проблемы с реализацией рекурсивной функции Java, которая вычисляет синус, используя ряды Тейлора без использования математической библиотеки - PullRequest
0 голосов
/ 11 апреля 2019

Я пытаюсь написать рекурсивный код, который вычисляет синус с использованием ряда Тейлора, и мне не разрешено использовать Math.sin. Программа должна завершиться, когда следующий член ряда Тейлора будет меньше 0,0000001.

Проблема в том, что я не знаю, как сохранить результат при повторном вызове функции.

Пока это мой код, но, похоже, он даже не вспоминает себя, пока следующий член ряда Тейлора не станет меньше 0,0000001:

public static double sin(double x, int y, int i) {  
    if (i % 2 == 0) {
        if ((P(x, y) / F(y)) < 0.0000001) {
            return result; 
        } else {
            return sin(x, y+2, i++) + (P(x, y) / F(y)));
        }
    } else {    
        if ((P(x, y) / F(y)) < 0.0000001) {
            return result;
        } else {
            return sin(x, y+2, i++) + (P(x, y) / F(y)) * (-1));
        }
    }   
}

public static double F( int n) {
    if (n==0 || n==1) {
        return 1;
    } else {
        return n* F(n - 1);
    }
}

public static double P(double x, int y) {
    if (y == 0) {
        return 1;
    }

    if (y == 1) {
        return x;
    } else {
        return x * P(x, y - 1);
    }
}

1 Ответ

0 голосов
/ 11 апреля 2019

Чтобы получить ваш результат, вам просто нужно вызвать функцию sin (double x, int y, int i) с начальными параметрами и сохранить значение, возвращаемое в переменную, как в обычной функции.

первый вызов функции sin будет вызывать «внутренне» другие функции sin с другими параметрами, пока это условие не станет истинным: (P (x, y) / F (y)) <0.0000001 </p>

Таким образом, вместо возврата переменнойрезультат, который не определен, вы должны изменить свою функцию sin следующим образом:

public static double sin(double x, int y, int i) {  
    if (i % 2 == 0) {
        if ((P(x, y) / F(y)) < 0.0000001) {
            return (P(x, y) / F(y)); 
        } else {
            return sin(x, y+2, i++) + (P(x, y) / F(y)));
        }
    } else {    
        if ((P(x, y) / F(y)) < 0.0000001) {
            return (P(x, y) / F(y));
        } else {
            return sin(x, y+2, i++) + (P(x, y) / F(y)) * (-1));
        }
    }   
}
...