Re: Такая вот задача
От: Кодт Россия  
Дата: 28.03.18 09:18
Оценка:
Здравствуйте, Kaifa, Вы писали:


K>Есть произвольное лямбда-выражение. Про это лямбда-выражение известно, что в нем могут встречаться вызовы функции F(x). Причем вызовы могут встречаться несколько раз, и могут встречаться вызовы с одними и теми же аргументами. Про функцию F(x) известно, что она работает “достаточно медленно”, если вызывать ее с одними и теми же аргументами, то всегда будет возвращать одинаковый результат.


K>Задача: сделать оптимизацию исходного лямбда-выражения, то есть избавиться от одинаковых вызовов функции F(x).


K>Пример.


K>На входе выражение:


K>(int x, int y) => F(x) > F(y) ? F(x) : (F(x) < F(2*y) ? F(2*y) : F(y))


(x, y) => (
  (y, fx, fy) => (
    fx > fy ? fx : (fx, fy, f2y) => (      -- обойдёмся без замыканий, пробросим нужные значения как аргументы
                     fx < f2y ? f2y : fy
                   )(fx, fy, F(2*y))
  )(y, F(x), F(y))
)


K>На выходе:


K>Лямбда-выражения, которые делают предварительное вычисление параметров:

K>var p1 = (int x) => F(x);
K>var p2 = (int y) => F(y);
K>var p3 = (int y) => F(2*y);

Неправильно ты, дядя Фёдор, тернарный оператор делаешь. Вычислять p3 нужно только после проверки !(p1>p2).

K>То есть сначала выполняется оптимизация, потом вычисление. Прошу учесть, что исходное лямбда-выражение может иметь совершенно произвольную форму. Так же функция F может иметь совершенно произвольный вид и набор параметров.


Задача на потрахаться с абстрактным синтаксическим деревом? Или со строкой лямбда-выражения?
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.