Задание: Вычислить значение синуса sin(x) с помощью разложения в ряд Тейлора.

При этом задана некоторая точность эпсилон: когда очередное слагаемое из ряда Тейлора становится меньше эпсилон вычисления прекращаются и выводится результат.

Ряд Тейлора синуса sin(x) имеет вид:

Рекурсивная реализация

using System;

class Program
{
    /// <summary>
    /// Рекурсивный метод для вычисления факториала числа
    /// </summary>
    /// <param name="num">Число</param>
    /// <returns>Результат</returns>
    static double Factorial(uint num)
    {
        if (num <= 1)
        {
            return 1d;
        }

        return num * Factorial(num - 1);
    }

    /// <summary>
    /// Рекурсивный метод возведения в степень
    /// </summary>
    /// <param name="num">Число</param>
    /// <param name="pow">Степень</param>
    /// <returns>Результат</returns>
    static double Power(double num, int pow)
    {
        if (pow == 0)
        {
            return 1;
        }

        return num * Power(num, pow - 1);
    }

    /// <summary>
    /// Модуль числа
    /// </summary>
    /// <param name="num">Число</param>
    /// <returns>Абсолютное значение числа</returns>
    static double Abs(double num)
    {
        if (num >= 0)
        {
            return num;
        }

        return -num;
    }

    /// <summary>
    /// Рекурсивный метод вычисления sin(x)
    /// </summary>
    /// <param name="x"></param>
    /// <param name="n"></param>
    /// <param name="precision">Точность</param>
    /// <returns>Результат</returns>
    public static double Sin(double x, int n = 0, double precision = 1e-10)
    {
        var t = Power(-1, n) * Power(x, 2 * n + 1) / Factorial((uint)(2 * n + 1));
        if (Abs(t) < precision)
        {
            return t;
        }

        return t + Sin(x, n + 1, precision);
    }

    public static void Main()
    {
        Console.Write("x = ");
        var x = double.Parse(Console.ReadLine());
        var result = Sin(x);
        Console.WriteLine("Sin(x)      = {0:f4}", result);
        Console.WriteLine("Math.Sin(x) = {0:f4}", Math.Sin(x));
        Console.ReadKey(true);
    }
}

Вместо метода Power можно использовать Math.Pow, языка C#.
Вместо метода Abs можно использовать Math.Abs.

Смотрите также: