首页 > 解决方案 > 指数和阶乘的序列迭代产生意外结果

问题描述

我在学习过程中尝试了一个简单的任务,但我被卡住了并且有一些奇怪的结果。我必须编写一个带有 2 个参数“x”和“a”的简单方法。此方法的结果必须是所有 x k /k 的总和!其中k从0开始到无穷大,'a'是精度参数。

这里看起来如何

但我不知道为什么当我将 Console.Write 放在循环内时,数字表现得很疯狂, 我有这个 x = 2 和 x = 6

此外,当我试图将我的代码放入方法并使用结果时,什么也没有发生。我有另一种数学阶乘计算 k 的方法!

decimal wynik = 0;
int x = 2;
int a = 6;

for (int k = 1; k > 0; k++)
{
    if (Algorithms.Factorial(k) > 0)
    {
        wynik += Math.Round(Convert.ToDecimal(Math.Pow(x, k)) / 
                            Algorithms.Factorial(k), a);
    
        Console.WriteLine(wynik);
    }
}
    
Console.WriteLine(wynik);

Factorial方法

static public int Factorial(int n)
{
    int wynik = 1;
    
    for (int i = 1; i <= n; i++)
    {
        wynik *= i;
    }
    
    return wynik;
}

当然,我想以方法结束并返回结果,但是为了练习,我正在使用 Main 方法,非常感谢您的帮助!

标签: c#algorithmfactorial

解决方案


阶乘增长很快,请看

  13! = 6227020800 > int.MaxValue

这就是为什么返回很可能导致int整数溢出和奇怪的结果。 增长也很快(虽然没有阶乘那么快)让这些大数相互抵消static public int Factorial(int n)x ** k

  double x = 2;

  double tolerance = 0.00001;

  double result = 1.0; // x**0 / 0! == 1 / 1 == 1
  double term = 1.0;

  for (int k = 1; term > tolerance; ++k) {
    // given term = (x ** (k - 1)) / (k - 1)! 
    // we can compute next term as
    term = term * x / k;

    result += term;
  } 

  // Let's have a look (in fact, you have Taylor serie for exp)
  Console.WriteLine($"actual   : {result} (+/- {tolerance:0.##############})";
  Console.WriteLine($"expected : {Math.Exp(x)}"");

结果:

actual   : 7.3890545668323435 (+/- 0.00001)
expected : 7.38905609893065

推荐阅读