gpt4 book ai didi

c# - 在 C# 中优化尾调用

转载 作者:行者123 更新时间:2023-11-30 14:03:41 24 4
gpt4 key购买 nike

我有一个深度递归函数,理论上即使输入很大也应该能很好地工作。问题是在撰写本文时我忘记了 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));
}

IsSimpleProcessExpansion 都有相对固定的堆栈深度——唯一的问题是 Simplify 和 Expand 之间的递归。您将如何减少此处的堆栈深度?

我正在考虑返回将计算结果的委托(delegate),但这似乎有点矫枉过正 - 必须有更简单的方法。这是我想到的一个解决方案(它不是很完善,因为我一直认为我一定是在这里做错了一些可怕的事情):

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));
}

所以我的两个问题是:

  1. 感觉这个解决方案有什么可怕的错误?
  2. 你能想到更好的吗?

最佳答案

这不就是

while(!IsSimple(param))
param = ProcessExpansion(param);
return param;

?

关于c# - 在 C# 中优化尾调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3681469/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com