Завдання: Обчислити значення квадратного кореня √(1+x) за допомогою розкладення в ряд Тейлора.
При цьому задана деяка точність епсілон: якщо наступний доданок із ряду Тейлора стає меншим за епсілон, то обчислення припиняються і виводиться результат.
Ряд Тейлора квадратного кореня √(1+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>
/// Рекурсивний метод обчислення sqrt(1+x)
/// </summary>
/// <param name="x"></param>
/// <param name="n"></param>
/// <param name="precision">Точність</param>
/// <returns>Результат</returns>
public static double Sqrt1PlusX(double x, int n = 0, double precision = 1e-10)
{
var current = Power(-1, n) * Factorial((uint)(2 * n)) / ((1 - 2 * n)
* Power(Factorial((uint)n), 2) * Power(4, n)) * Power(x, n);
if (Abs(current) < precision)
{
return current;
}
return current + Sqrt1PlusX(x, n + 1, precision);
}
public static void Main()
{
Console.Write("x = ");
var x = double.Parse(Console.ReadLine());
var result = Sqrt1PlusX(x);
Console.WriteLine("Sqrt1PlusX(x) = {0}", result);
Console.WriteLine("Math.Sqrt(1+x) = {0}", Math.Sqrt(1 + x));
Console.ReadKey(true);
}
}
Замість метода Power можна використовувати Math.Pow, мови C#.
Замість метода Abs можна використовувати Math.Abs.