Введение в лямбда-выражения
Лямбда-выражения - базовый примитив программирования на PascalABC.NET. При обучении начинающих они возникают как параметры стандартных подпрограмм и методов.
Учителю психологически трудно перейти на использование лямбда-выражений по нескольким причинам:
- лямбда-выражения кажутся сложными
- лямбда-выражения кажутся относящимися лишь к профессиональному программированию
- нигде в доступной учебной литературе не используются лямбда-выражения
Мы попытаемся развеять эти мифы.
Итак: лямбда-выражения - это просто.
Лямбда-выражение - это функция. Функция отображает параметр на значение. Например, квадратичная функция в школе записывается как
f(x) = x * x
Её можно записать также в виде:
f: x -> x * x
что означает, что функция с именем f сопоставляет каждому x
значение x*x
.
Запись x -> x * x
и называется в PascalABC.NET лямбда-выражением или лямбда-функцией. Заметим, что в отличие от предыдущей записи лямбда-функция не имеет имени. Именно поэтому часто лямбда-функция называется безымянной функцией.
Другие примеры лямбда-функций:
Линейная функция:
x -> 2*x + 3
Функция, проверяющая, чётно ли x, и возвращающая True если чётно и False в противном случае:
x -> x mod 2 = 0
Чаще всего лямбда-функции встречаются как параметры других функций. Далее будет рассмотрено множество подобных примеров.
Генераторы массивов с лямбда-функциями
Для генерации массивов с элементами, заполненными по некоторому правилу, используется функция ArrGen. У неё - две основные модификации.
Генерация по формуле a[i] = f(i)
var a := ArrGen(10,i->f(i));
Здесь первый параметр - количество элементов массива, второй - лямбда функция, переводящая индекс элемента в значение. Нумерация i начинается с нуля.
Можно начать нумерацию с другого значения, указав третий параметр. Например, чтобы заполнить массив квадратами натуральных чисел начиная с 1, требуется написать:
var a := ArrGen(10,i->i*i,1);
Генерация по рекуррентной формуле, в которой следующий элемент определяется по предыдущему
var a := ArrGen(10,1,x->x+2);
Здесь генерируется массив из 10 элементов, первый равен 1, а каждый последующий больше предыдущего на 2
var a := ArrGen(10,1,x->x*2);
Здесь генерируется массив из 10 элементов, первый равен 1, а каждый последующий больше предыдущего в 2 раза