Можно ли обмануть сериализацию дерева выражений в поддержку рекурсии через замещающий токен? - PullRequest
1 голос
/ 01 августа 2011

Все мы знаем, что деревья выражений не поддерживают рекурсию.Я могу создать рекурсивный 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 создает деревья выражений и поддерживаетрекурсия .Генетическое программирование изменяет деревья выражения.Существует несколько типов проблем, решения которых по своей природе являются рекурсивными, поскольку они требуют отслеживания предшествующего состояния: обход дерева, поиск в глубину и алгоритмы «разделяй и властвуй».Я стремлюсь генерировать эффективные алгоритмы в управляемой распределенной среде, где ветви могут передаваться и рекомбинировать.

Мой вопрос: как я могу переопределить сериализацию / десериализацию для замены / в вызове с нерекурсивный «фиктивный» токен, заменяющий рекурсивный вызов при перезагрузке десериализованного дерева?

1 Ответ

0 голосов
/ 01 августа 2011

Я знаю, что это не точный ответ на ваш вопрос, но я бы применил шаблон Replace Recursion with Iteration Refactoring.

Рекурсию обычно считают плохой, и иногда ее считают ленивой.Однако я понимаю необходимость сначала решить проблему, а затем реорганизовать код, чтобы его можно было легко поддерживать и читать.

...