是否有可能通过替换令牌欺骗表达式树序列化来支持递归?

本文关键字:序列化 支持 递归 表达式 欺骗 有可能 替换 令牌 是否 | 更新日期: 2023-09-27 18:04:04

我们都知道表达式树不支持递归。我可以创建一个递归函数,将它封装在表达式树中,然后调用它。

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构造表达式树并支持递归。遗传编程改变了表达树。有一些类型的问题,其解决方案本质上是递归的,因为它们需要跟踪先前的状态:树遍历、深度优先搜索和分治算法。我的目标是在一个受管理的分布式环境中生成高效的算法,在这个环境中,分支可以被传递和重组。

我的问题是:我如何重写序列化/反序列化,用非递归"mock"令牌交换出/入调用,在重新加载反序列化树时交换递归调用?

是否有可能通过替换令牌欺骗表达式树序列化来支持递归?

我知道这不是你问题的确切答案,但我会应用迭代重构模式替换递归。

递归通常被认为是不好的,有时被视为懒惰。然而,我理解首先解决问题的必要性,然后重构代码,以便可以轻松维护和阅读。