Завдання: Обчислити значення експоненти ex за допомогою розкладання в ряд Тейлора.

При цьому задана деяка точність епсілон: якщо наступний доданок із ряду Тейлора стає меншим за епсілон, то обчислення припиняються і виводиться результат.

Ряд Тейлора експоненти має вигляд:

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

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="x"></param>
    /// <param name="n"></param>
    /// <param name="precision">Точність</param>
    /// <returns>Результат</returns>
    static double Exp(double x, int n = 0, double precision = 1e-10)
    {
        var current = Power(x, n) / Factorial((uint)n);
        if (current < precision)
        {
            return current;
        }

        return current + Exp(x, n + 1, precision);
    }

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

Замість метода Power можна використовувати Math.Pow, мови C#.

Ітеративна реалізація

using System;

class Program
{
    /// <summary>
    /// Метод для обчислення експоненти
    /// </summary>
    /// <param name="x"></param>
    /// <param name="precision">Точність</param>
    /// <returns>Результат</returns>
    static double Exp(double x, double precision = 1e-10)
    {
        var result = 0d;
        var current = 1d;
        var factorial = 1d;
        var power = 1d;
        var n = 1;
        while (current > precision)
        {
            current = power / factorial;
            result += current;
            power *= x;
            factorial *= n;
            n++;
        }

        return result;
    }

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

Дивіться також: