Все мы знаем, что деревья выражений не поддерживают рекурсию.Я могу создать рекурсивный Func, обернуть его в дерево выражений и вызвать его.
Func<int, int> func1 = null;
func1 = x => (x == 0) ? 1 : x * func1(x - 1);
Expression<Func<int, int>> expression1 = i => func1(i);
var func1 = expression1.Compile();
var z1 = func1.Invoke(5);
Однако, когда я пытаюсь сериализоваться (например, используя MetaLINQ), я, конечно, получаю исключение, поскольку это рекурсивное выражение.
Lisp создает деревья выражений и поддерживаетрекурсия .Генетическое программирование изменяет деревья выражения.Существует несколько типов проблем, решения которых по своей природе являются рекурсивными, поскольку они требуют отслеживания предшествующего состояния: обход дерева, поиск в глубину и алгоритмы «разделяй и властвуй».Я стремлюсь генерировать эффективные алгоритмы в управляемой распределенной среде, где ветви могут передаваться и рекомбинировать.
Мой вопрос: как я могу переопределить сериализацию / десериализацию для замены / в вызове с нерекурсивный «фиктивный» токен, заменяющий рекурсивный вызов при перезагрузке десериализованного дерева?