我们都知道Expression Trees不支持递归。 我可以创建一个递归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构造表达式树和supports recursion。遗传编程会改变表达树。存在一些类型的问题,其解决方案本质上是递归的,因为它们需要跟踪先前状态:树遍历,深度优先搜索和分而治之算法。我的目标是在托管分布式环境中生成有效的算法,其中分支可以传递并重新组合。
我的问题是:如何重写序列化/反序列化以使用非递归“模拟”标记交换/在调用中,在重新加载反序列化树时交换递归调用?
答案 0 :(得分:0)
我知道这不是你问题的确切答案,但我会将替换递归应用于迭代重构模式。
递归通常被认为是错误的,有时看起来很懒惰。然而,我理解首先需要解决问题,然后重构代码,以便可以轻松维护和阅读。