Programming Taskbook 0


Download 1.62 Mb.
Pdf ko'rish
bet22/71
Sana21.06.2023
Hajmi1.62 Mb.
#1644761
TuriУчебное пособие
1   ...   18   19   20   21   22   23   24   25   ...   71
Bog'liq
Abramyan-Pascal2016-1


Глава 3. Массивы и последовательности 
41 
Скорость выполнения вариантов 4 и 4a будет одинаковой. 
В качестве еще одного варианта реализации данной программы рас-
смотрим следующий: 
// Вариант 5 
var sum := ArrFill(100000000, 1).Select(e -> 2* e).Sum; 
Print(sum, Milliseconds); 
Он отличается от варианта 4a только тем, что вместо функции SeqFill 
используется функция ArrFill. Результат работы программы: 
200000000 2211 
Время хуже, чем для вариантов 2 и 3 с применением циклов. Таким 
образом, хотя к массиву допустимо применять запросы (поскольку масси-
вы могут быть неявно преобразованы в последовательности), они не дают 
такого же эффекта ускорения, как при применении к последовательностям.
Как мы выяснили, анализируя варианты 2 и 3, цикл for для массивов 
работает с той же скоростью, что и цикл foreach. Что произойдет, если мы 
попытаемся использовать цикл for для последовательностей? Для этого 
необходимы запросы, которые позволили бы определять размер последо-
вательности и значение ее i-го элемента. Такие запросы есть: это Count и 
ElementAt(i) соответственно. Однако их никогда не следует использовать для 
организации перебора элементов последовательности, поскольку запрос 
ElementAt(i) работает крайне медленно (и, кроме того, время его работы уве-
личивается с увеличением значения индекса i). Поэтому окончания работы 
следующего варианта программы мы не дождемся
2

// Вариант 6 (НЕДОПУСТИМЫЙ) 
var a := SeqFill(100000000, 1).Select(e -> 2 * e); 
var sum := 0; 
for var i := 0 to a.Count-1 do 
sum += a.ElementAt(i); 
Print(sum, Milliseconds / 1000); 
Итак, на основе анализа различных вариантов нашей программы мож-
но сделать вывод о том, что как массивы, так и последовательности явля-
ются эффективным средством обработки данных, однако при работе с ни-
ми надо учитывать их особенности. Нетрудно заметить, что программы, 
использующие последовательности, оказываются чрезвычайно наглядны-
ми. В то же время, следует иметь в виду, что нередко алгоритмы, основан-
ные на обработке последовательностей, работают медленнее, чем традици-
онные алгоритмы, использующие циклы (поскольку программный код с 
последовательностями сложнее оптимизировать). Кроме того, имеются 
2
По приблизительным подсчетам, данный вариант программы выполнялся бы на том 
же компьютере, на котором запускались предыдущие варианты, более двух лет. 


42 
группы задач, для решения которых последовательности плохо приспособ-
лены (например, из-за очень медленного доступа к элементу по его индек-
су). И в первом, и во втором выпуске настоящего пособия все особенности 
последовательностей мы проиллюстрируем на многочисленных примерах.
3.5.
Вывод последовательностей и их генерация. 
Бесконечные последовательности 
При описании средств вывода элементов массивов в конце п. 3.2 было 
отмечено, что многие из этих средств можно использовать не только для 
массивов, но и для последовательностей. Фактически единственным сред-
ством, которым не следует пользоваться для вывода последовательности, 
является обычный цикл for. 
Напомним, что для вывода последовательностей можно использовать 
цикл foreach, процедуры Write/Writeln и Print/Println, а также методы 
Print/Println. В методах Print/Println, как и в одноименных методах для масси-
вов, можно указывать необязательный строковый параметр delim — разде-
литель, который будет выводиться между значениями элементов. По 
умолчанию разделителем считается пробел (исключением является после-
довательность символов sequence of char, для которой разделителем по 
умолчанию всегда считается пустая строка). Изменить разделитель по 
умолчанию можно, записав его новое значение в системную переменную 
PrintDelimDefault. 
При выводе последовательностей в программах, выполняющих зада-
ния из электронного задачника Programming Taskbook, следует использо-
вать методы Write и WriteAll (метод WriteAll перед выводом элементов допол-
нительно выводит размер последовательности). Вместо метода Write можно 
использовать метод Print, который в данном случае выполняет те же самые 
действия. 
В предыдущем пункте мы отмечали, что для генерации последова-
тельностей можно использовать функции Seq, SeqFill, SeqGen, SeqRandom-
Integer (синоним SeqRandom) и SeqRandomReal. Эти функции аналогичны по 
своему действию функциям для генерации массивов. Кроме них для по-
следовательностей предусмотрены еще две функции-генератора: Range и 
SeqWhile. 
Функция Range позволяет задавать диапазоны целых чисел или симво-
лов, а также диапазоны равномерно распределенных вещественных чисел. 
Приведем заголовки трех перегруженных вариантов этой функции: 
function Range(k1, k2: integer [; step: integer]):
sequence of integer 
function Range(c1, c2: char): sequence of char 
function PartitionPoints(a1, a2: real; n: integer): sequence of real 


Download 1.62 Mb.

Do'stlaringiz bilan baham:
1   ...   18   19   20   21   22   23   24   25   ...   71




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling