Programming Taskbook 0
Download 1.62 Mb. Pdf ko'rish
|
Abramyan-Pascal2016-1
- Bu sahifa navigatsiya:
- Array1 ); // Вариант 3
- Array5 ); // Вариант 2
- Array1 : Task(Array1 ); // Вариант 4
Глава 3. Массивы и последовательности 49 мощью задачи Array1 и Array5 (решения этих задач с применением функ- ций-генераторов массивов были приведены в п. 3.3). Для генерации начальной части последовательности нечетных чисел удобно использовать метод Step: Task('Array1'); // Вариант 3 1.Step(2).Take(ReadInteger).Print; Для генерации начальной части последовательности Фибоначчи мож- но, как уже было отмечено выше, использовать метод Iterate: Task('Array5'); // Вариант 2 1.Iterate(1, (a, b) -> a + b).Take(ReadInteger). Print; В данном случае надо указать целочисленные значения начальных элементов последовательности, так как в задаче Array5 требуется вывести данные целого типа. 3.6. Дополнение. Генерация последовательностей c помощью конструкции yield Начиная с версии 3.1, в PascalABC.NET реализован еще один, наибо- лее универсальный механизм генерации последовательностей, основанный на применении специального оператора yield (это слово может переводить- ся как «выход, выработка»; читается «йилд»). Хотя для решения большин- ства задач, связанных с обработкой последовательностей, вполне доста- точно рассмотренных выше средств генерации, этот механизм полезно изучить хотя бы потому, что он позволяет более наглядно представить себе те действия, которые выполняются при создании и использовании после- довательностей, и лучше понять, каким образом можно создать последова- тельность, не сохраняя в памяти все ее элементы. Оператор yield указывается в функциях, возвращающих последова- тельность, в следующем формате: yield выражение; Выражение, указанное после слова yield, считается очередным элемен- том формируемой последовательности. Понятно, что если функция воз- вращает последовательность некоторого типа T (например, integer), то все выражения, указанные после yield, также должны иметь тип T или неявно приводиться к этому типу. Операторы yield являются заменителями операторов, определяющих возвращаемые значения функции; в частности, в функции, использующей yield, запрещено обращаться к переменной Result. Если в функции имеется последовательность, элементы которой надо вернуть, то можно использовать следующую модификацию оператора yield: yield sequence последовательность; 50 Функция может содержать любое количество операторов yield и yield sequence; требуется лишь, чтобы выражения, указываемые в этих операто- рах, имели допустимые типы. В качестве простого примера приведем функцию, генерирующую по- следовательность, содержащую первые n положительных нечетных чисел: function OddGen(n: integer): sequence of integer; begin for var i := 1 to n do yield 2 * i - 1; end; С помощью этой функции можно реализовать еще один вариант ре- шения задачи Array1: Task('Array1'); // Вариант 4 OddGen(ReadInteger).Write; При анализе функции, использующей yield, необходимо учитывать, что эта конструкция является «отложенной». В тот момент, когда вызывается функция, никакие действия по вычислению элементов не выполняются, а в созданной последовательности сохраняется лишь «программа» их вычис- ления. Активизируется эта программа только при переборе элементов по- следовательности в цикле foreach или в других случаях, требующих созда- ния и обработки ее элементов. Но и в этом случае элементы не будут раз- мещаться в памяти одновременно: они вычисляются последовательно и сразу разрушаются после обработки. Обратите внимание на то, что в самой функции OddGen никак не сохраняются найденные нечетные числа. Они пересылаются «наружу» оператором yield, после чего сразу «забываются». Именно так и работает механизм определения и использования последова- тельности. Нет никаких препятствий к тому, чтобы определить с помощью yield функцию, возвращающую бесконечную последовательность. Например, реализовать генератор последовательности всех положительных нечетных чисел можно следующим образом: function AllOddGen: sequence of integer; begin var i := 1; while True do begin yield i; i += 2; end; end; |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling