3

我有一个这样写的数学问题:

x^1+x^2+x^3+...+x^n

C# 中是否有任何构造可以帮助我解决这些方程?

我知道我可以编写一个 for 循环或使用递归来完成此操作,但我记得读过 c# 中的一些构造,它将预编译这样的语句以供以后执行。

有什么有趣的方法可以解决这些方程吗?

4

6 回答 6

8

要计算 x^n 使用Math.Pow

Math.Pow(x, n)

如果要计算总和,可以使用循环或 LINQ。我认为这里的简单循环没有任何问题:

double total = 0;
for (int i = 1; i <= n; ++i)
{
    total += Math.Pow(x, i);
}
Console.WriteLine(total);

可以在 LINQ 中编写此代码,但我看不出有什么特别充分的理由这样做。也许您可以扩展您正在寻找的功能?您在寻找更好的性能吗?

由于您的问题被标记为“数学优化”,您可能还想通过查找快捷方式来优化它。在这种特定情况下,它是一个几何级数,因此您可以使用以下公式:

替代文字

或者在 C# 中:

static double geometricSeries(double a, double r, int n)
{
    return a * (1 - Math.Pow(r, n + 1)) / (1 - r);
}

在其他更复杂的情况下,找到公式可能会更困难。

于 2010-08-14T19:37:41.230 回答
7

我知道你的例子是故意微不足道的。但是,如果您真正要计算的仍然是多项式,那么您绝对应该使用Horner scheme。这是一个 C# 实现

于 2010-08-14T19:57:34.223 回答
5

好吧,您可能正在谈论使用委托进行延迟执行。但在许多情况下,这与编写方法相同。例如,让我们从“简单”的方式开始:

public static double SumExponents(double x, int n)
{
    double total = 0;
    for (int i = 1; i <= n; i++)
    {
         total += Math.Pow(x, i);
    }
    return total;
}

这可以使用 LINQ 编写为:

public static double SumExponents(double x, int n)
{
    return Enumerable.Range(1, n)
                     .Select(i => Math.Pow(x, i))
                     .Sum();
}

然后,您可以将其编写为单个 lambda 表达式:

Func<double, int, double> func = (x, n) => Enumerable.Range(1, n)
                                              .Select(i => Math.Pow(x, i))
                                              .Sum();

那是你在想的那种事情吗?如果不是,请澄清您的问题。你在寻找什么并不是很明显。

于 2010-08-14T19:39:33.413 回答
1

关于几何级数,C# 没有什么特别之处。您可以在 O(1) 时间内计算此总和。(假设电源运行需要恒定的时间。)

在你的情况下,公式将是

x*(x^n - 1)/(x - 1)
于 2010-08-14T19:42:17.027 回答
0
int total = 0;
for(int i = 1; i <= n; i++)
    total += Math.Pow(x, i);
于 2010-08-14T19:38:47.717 回答
0

除了 select\sum,您还可以Aggregate用于折叠序列。

int n;
double x;
double result = Enumerable.Range(1, n)
    .Aggregate(0.0, (acc, i) => acc + Math.Pow(x, i));
于 2010-08-14T19:46:39.853 回答