Как вычислить уравнения этого типа (x ^ 1 + ... x ^ n) в C #? - PullRequest
3 голосов
/ 14 августа 2010

У меня есть математическая задача, которая написана так:

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

Существуют ли в C # конструкции, которые помогут мне решить подобные уравнения?

Я знаю, что мог бы написать цикл for или использовать рекурсию для достижения этой цели, но я помню, как читал о некоторой конструкции в c #, которая предварительно скомпилирует такой оператор для последующего выполнения.

Есть ли какие-нибудь интересные способы решения подобных уравнений?

Ответы [ 6 ]

8 голосов
/ 14 августа 2010

Для вычисления 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, но я не вижу особой причины для этого. Возможно, вы могли бы расширить, какие функции вы ищете? Вы ищете лучшую производительность?

Поскольку ваш вопрос помечен как «математическая оптимизация», вы также можете оптимизировать его, найдя ярлык. В данном конкретном случае это геометрическая серия , поэтому вы можете использовать формулу:

alt text

Или в C #:

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

В других более сложных случаях найти формулу может быть сложнее.

7 голосов
/ 14 августа 2010

Я понимаю, что ваш пример намеренно тривиален.Однако, если то, что вы действительно пытаетесь вычислить, все еще является полиномом, то вам определенно следует использовать схему Хорнера .Вот реализация C # .

5 голосов
/ 14 августа 2010

Ну, вы могли бы говорить об использовании делегата для отложенного выполнения. Но во многих случаях это то же самое, что написать метод. Например, давайте начнем с «простого» способа сделать это:

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();
}

Вы можете написать это как одно лямбда-выражение:

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

Это то, о чем вы думали? Если нет, пожалуйста, уточните свой вопрос. Не совсем очевидно, что вы ищете.

1 голос
/ 14 августа 2010

Нет ничего конкретного в C # о геометрической прогрессии .Вы можете вычислить эту сумму за O (1) раз.(Предполагается, что для работы в режиме питания требуется постоянное время.)

В вашем случае формула будет

x*(x^n - 1)/(x - 1)
0 голосов
/ 14 августа 2010

Помимо select \ sum, вы также можете использовать Aggregate для сворачивания последовательностей.

int n;
double x;
double result = Enumerable.Range(1, n)
    .Aggregate(0.0, (acc, i) => acc + Math.Pow(x, i));
0 голосов
/ 14 августа 2010
int total = 0;
for(int i = 1; i <= n; i++)
    total += Math.Pow(x, i);
...