Как бы я написал этот бесконечный ряд, чтобы продолжить? - PullRequest
0 голосов
/ 07 октября 2011

Просто из интереса (и я уверен, что применяемая методика пригодится в будущем)

Как можно было бы кодировать бесконечный ряд 1 + 1/2 +1/4 + 1 /8 ... до бесконечности, как фактическая сумма в C #?(Я уверен, что слово рекурсивный или рекурсивный может быть где-то использовано)

Ответы [ 4 ]

2 голосов
/ 07 октября 2011

Используя ленивую оценку, вы можете определить (но не оценить) бесконечную последовательность:

IEnumerable<double> Series()
{
  double sum=0;
  double element=1;
  while(true)
  {
    sum+=element;
    yield return sum;
    element/=2;
  }
}

Конечно, это ограничено ошибками округления и, следовательно, перестанет расти после примерно 53 итераций.

Вы можете определить это рекурсивно, но я не вижу причин для этого:

double Series(int n)
{
  if(n==0)
    return 1;
  else
    return Math.Power(0.5,n)+Series(n-1);
}
0 голосов
/ 07 октября 2011

Вы можете использовать десятичный тип данных, так как он поддерживает больше десятичных разрядов, чем двойной.Это можно сделать рекурсивно или с помощью цикла;Я бы порекомендовал с таким циклом:

// endValue is an input integer 
decimal acc = 0.0m;
int factor = 1;
for (; factor < endValue; factor *= 2)
{
    try
    {
        acc += (1.0m/(decimal)factor);
    }
    catch
    {
        // we've exceeded bounds of the datatype; return last result
    }
}
return acc;
0 голосов
/ 07 октября 2011
var val = 0.0;
var sum = 1.0;
while(true)
{
  val += sum;
  sum /= 2;
}
0 голосов
/ 07 октября 2011

Опираясь на идею, представленную CodeInChaos, вы можете создать

static IEnumerable<T> Series<T>(Func<T,T> function, 
                                   T seed, 
                                   int interations = int.MaxValue)
{
    T value = seed;

    for (int i = 0; i < iterations; i++)
    {
        value = function(value);
        yield return value;
    }
}

и

    static IEnumerable<T> Series<T>(Func<T, int, T> function, 
                                   T seed, 
                                   int interations = int.MaxValue)
{
    T value = seed;

    for (int i = 0; i < iterations; i++)
    {
        value = function(value, i);
        yield return value;
    }
}

, что позволит вам выполнять итерации по любым сериям, которые вам нравятся, например:

double total = 0;
double newTotal = 0;
foreach (double v in Series(v => v * .5, 1.0, 100))
{
    newTotal += v;
    Console.WriteLine(total);
    if (total == newTotal) break;
    total = newTotal;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...