在C#中优化尾调用

con*_*tor 3 c# tail-recursion tail-call-optimization

我有一个深度递归函数,理论上即使在大输入的情况下也能很好地工作.问题是在撰写本文时我忘记了C#没有很好地进行尾调用优化,如果有的话,所以我得到StackOverflowException了任何复杂足够的输入.该方法的基本结构是两个大方法,每个方法调用另一个.

public object Simplify(object param) {
    if (IsSimple(param))
        return param;
    else
        return Expand(param);
}

private object Expand(object param) {
    return Simplify(ProcessExpansion(param));
}
Run Code Online (Sandbox Code Playgroud)

二者IsSimpleProcessExpansion具有相对固定的堆栈深度-唯一的问题是简化和展开之间的递归.你会如何减少堆栈深度?

我正在考虑返回会计算结果的代表,但这看起来有点矫枉过正 - 必须有一种更简单的方法.这是我对解决方案的想法(它不是很精致,因为我一直认为我必须在这里做一些可怕的错误):

public object Simplify(object param) {
    object result = () => SimplifyInternal(param);
    while (result is Func<object>)
        result = ((Func<object>)result)();
    return result;
}

private object SimplifyInternal(object param) {
    if (IsSimple(param))
        return param;
    else
        return Expand(param);
}

private object Expand(object param) {
    return () => SimplifyInternal(ProcessExpansion(param));
}
Run Code Online (Sandbox Code Playgroud)

所以我的两个问题是:

  1. 这个解决方案有什么不可思议的错误?
  2. 你能想到一个更好的吗?

Bri*_*ian 8

不是这个

while(!IsSimple(param))
    param = ProcessExpansion(param);
return param;
Run Code Online (Sandbox Code Playgroud)