Тверской государственный университет
Опубликован: 02.12.2009 | Доступ: свободный | Студентов: 3450 / 677 | Оценка: 4.41 / 4.23 | Длительность: 09:18:00
ISBN: 978-5-9963-0259-8
Лекция 4:

Операторы языка C#

Вычисление сумм, произведений и рекуррентные соотношения

Повторю то, что уже говорилось при рассмотрении примера в первой лекции. Вычисление конечных сумм и произведений - это наиболее часто встречающийся тип элементарных задач, шаблон решения которых должен быть заучен как 2*2. Для вычисления суммы:

S=\sum\limits_{k=1}^n a_k

можно применить следующий шаблон:

S=0;
for(int k=1; k<=n; k++)
{
	//Вычислить текущий член суммы ak
	…
	S+=ak;
}

Часто приходится пользоваться слегка расширенным шаблоном:

Init;
for(int k=1; k<=n; k++)
{
	//Вычислить текущий член суммы ak
	…
	S+=ak;
}

В этом шаблоне Init представляет группу операторов, которые инициализируют значения переменных, используемых в цикле, значениями, обеспечивающими корректность применения цикла. В частном случае, рассмотренном выше, инициализация сводится к заданию значения переменной S. Заметьте, если перед началом цикла не позаботиться о том, чтобы эта переменная была равна нулю, то после завершения цикла результат не будет верным.

В этой схеме основные проблемы могут быть связаны с вычислением текущего члена суммы ak. Нужно понимать, что ak - это простая переменная, а не массив. Значения этой переменной вычисляются заново на каждом шаге цикла, задавая очередной член суммирования. Кроме того, следует заботиться об эффективности вычислений, применяя два основных правила, позволяющие уменьшить время вычислений.

Чистка цикла. Все вычисления, не зависящие от k, должны быть вынесены из цикла (в раздел Init).

Рекуррентная формула. Часто можно уменьшить время вычислений ak, используя предыдущее значение ak. Иногда приходится вводить дополнительные переменные, хранящие уже вычисленные значения нескольких членов суммы. Рекуррентная формула выражает новое значение ak через предыдущее значение и дополнительные переменные, если они требуются. Начальные значения ak и дополнительных переменных должны быть корректно установлены перед выполнением цикла в разделе Init. Заметьте, что если начальное значение ak вычисляется в разделе Init до цикла, то схема слегка модифицируется - вначале выполняется прибавление ak к S, а затем новое значение ak вычисляется по рекуррентной формуле.

Рассмотрим пример. Пусть необходимо вычислить сумму:

S=\sum\limits_{k=0}^n x^k/k!=1+x/1+x^2/2!+x^3/3!+\ldots+x^n/n!

Тогда в соответствии с шаблоном

ak=x^k/k!

Можно построить рекуррентную формулу для ak, поскольку каждое следующее значение равно предыдущему значению, умноженному на x и деленному на k. Вычисление суммы задает следующий фрагмент программы:

int S =0;
int ak=1;
for(int k=0; k<=n; k++)
{
	S+=ak;
//Вычислить текущий член суммы ak
	ak *=x/k;	
}

Большинство задач этого раздела соответствуют этому шаблону. Рекуррентную формулу чаще всего можно получить, записав выражение для a_k и a_{k-1} и вычислив затем их отношение. В некоторых задачах (они отмечены звездочкой) получение рекуррентной формулы может требовать больших усилий.

Начиная с этой задачи, мы будем в большинстве случаев опускать слова "Постройте консольное и Windows-приложение", полагая их подразумевающимися по умолчанию. Предполагается также, что консольное приложение позволяет проводить многократные эксперименты. При необходимости в консольном приложения предполагается построение меню.

  • 24. Дано натуральное число n. Вычислить сумму первых n членов расходящегося гармонического ряда:
    \sum\limits_{k=1}^n \frac{1}{k}
  • 25. Дано натуральное число nmax и вещественное число b. Найти, если оно существует, такое наименьшее n, меньшее nmax, что:
    \sum\limits_{k=1}^n \frac{1}{k}>b
    Если сумма nmax членов гармонического ряда меньше b, то необходимо выдать соответствующее сообщение.
  • 26. Дано натуральное число n. Вычислить сумму первых n членов ряда:
    \sum\limits_{k=1}^n \frac{1}{k}
    При суммировании исключается каждый третий член.
  • 27. Дано натуральное число n. Вычислить сумму первых 2n членов ряда:
    \sum\limits_{k=1}^{2n} \frac{(-1)^{k+1}}{k}
    Вычислить эту сумму четырьмя разными способами: последовательно слева направо, последовательно справа налево, слева направо, вычисляя вначале положительные члены ряда, затем отрицательные, справа налево, вычисляя вначале положительные члены ряда, затем отрицательные. Сравните результаты вычислений. Чем объясняется различие в последних цифрах при больших n? Как влияет на результат использование типов float или double для переменных, задающих суммы и текущий член при суммировании?
  • 28. Дано натуральное число n. Вычислить сумму первых 2n членов ряда:
    \sum\limits_{k=1}^{2n} \frac{(-1)^{k+1}}{k\sqrt[k]{(k+1)}}
  • 29. Дано натуральное число n. Вычислить произведение первых n членов ряда:
    \prod\limits_{k=1}^n \frac{k+1}{k}}
  • 30. Даны натуральные числа n и k (n>=k). Вычислить биномиальный коэффициент C_n^k:
    C_n^k=\frac{n!}{(n-k)!k!}=\frac{n(n-1)\ldots(n-k+1)}{k!}=\prod\limits_{i=1}^k \frac{n-i+1}{i}}
  • 31. Даны натуральные числа n и m (n>=m). Вычислить сумму биномиальных коэффициентов:
    S=\sum\limits_{i=0}^m C_n^i=\sum\limits_{i=0}^m\prod\limits_{j=1}^i \frac{n-j+1}{j}}
    Следует напомнить, что определения функций суммы и произведения предполагают:
    \sum\limits_{i=n}^m a_i=0\quad\text{если}\quad m<n\\ \prod\limits_{i=n}^m a_i=1\quad\text{если}\quad m<n
  • 32. Дан массив B размерности n*m и массив C размерности m*n. Вычислить сумму диагональных элементов матрицы A = B*C:
    S=\sum\limits_{i=1}^n \sum\limits_{k=1}^m b_{ik}c_{ki}
  • 33. Дан массив B размерности n*m и массив C размерности m*n. Вычислить произведение диагональных элементов матрицы A = B*C:
    P=\prod\limits_{i=1}^n \sum\limits_{k=1}^m b_{ik}c_{ki}
  • 34. Даны натуральные числа n и m, вещественное x. Вычислить:
    S=\sum\limits_{i=1}^n \sum\limits_{j=1}^m \frac{1+\sin(ix)}{1+\cos(jx)}
  • 35. Даны натуральные числа n и m, вещественное x. Вычислить:
    S=\sum\limits_{i=1}^n \sum\limits_{j=1}^m \frac{1+\sin(ijx)}{1+\cos(ijx)}
Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

как я получу диплом о профессиональной переподготовке?

Илья Ардов
Илья Ардов

Добрый день!

Я записан на программу. Куда высылать договор и диплом?