От: | Kaifa | ||
Дата: | 28.03.18 05:16 | ||
Оценка: |
Есть произвольное лямбда-выражение. Про это лямбда-выражение известно, что в нем могут встречаться вызовы функции F(x). Причем вызовы могут встречаться несколько раз, и могут встречаться вызовы с одними и теми же аргументами. Про функцию F(x) известно, что она работает “достаточно медленно”, если вызывать ее с одними и теми же аргументами, то всегда будет возвращать одинаковый результат.
Задача: сделать оптимизацию исходного лямбда-выражения, то есть избавиться от одинаковых вызовов функции F(x).
Пример.
На входе выражение:
(int x, int y) => F(x) > F(y) ? F(x) : (F(x) < F(2*y) ? F(2*y) : F(y))
На выходе:
Лямбда-выражения, которые делают предварительное вычисление параметров:
var p1 = (int x) => F(x);
var p2 = (int y) => F(y);
var p3 = (int y) => F(2*y);
и оптимизированное выражение:
(p1, p2, p3) => p1 > p2 ? p1 : (p1 < p3 ? p3 : p2)
Требуется создать функцию оптимизированного вычисления выражения вида:
OptimizedCalculation(lambda, lambdaParams, functionF) { var optimized = OptimizeLambda(lambda, functionF); var result = CalculateLambda(optimized, lambdaParams); return result; }
То есть сначала выполняется оптимизация, потом вычисление. Прошу учесть, что исходное лямбда-выражение может иметь совершенно произвольную форму. Так же функция F может иметь совершенно произвольный вид и набор параметров.