Такая вот задача
От: 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 может иметь совершенно произвольный вид и набор параметров.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.