C# 是否存在迭代递归或迭代递归算法?

C# 是否存在迭代递归或迭代递归算法?,c#,algorithm,recursion,iteration,C#,Algorithm,Recursion,Iteration,迭代递归或迭代递归算法是否存在效率最高的输出和尾部递归 最好的泛语是C 例如:在输入时,此算法获取下一个简单函数: public static ulong Factorial(ulong n) { return n == 0 ? 1 : n * Factorial(n - 1); } 处理后返回以下内容: public static ulong Factorial(ulong n) { ulong result = 1; for (ulong i = 1; i <

迭代递归或迭代递归算法是否存在效率最高的输出和尾部递归

最好的泛语是C

例如:在输入时,此算法获取下一个简单函数:

public static ulong Factorial(ulong n)
{
    return n == 0 ? 1 : n * Factorial(n - 1);
}
处理后返回以下内容:

public static ulong Factorial(ulong n)
{
    ulong result = 1;
    for (ulong i = 1; i <= n; i++)
        result = result * i;
    return result;
}
公共静态ulong阶乘(ulong n)
{
ulong结果=1;

对于(ulong i=1;i是的,总是可以从递归算法创建迭代版本。我不知道C#是否有程序/代码重写器来实现这一点。这种技术已经得到了很好的研究,您可以找到类似的一般参考。
最坏的情况是简单地“模拟”堆上的堆栈,以保存函数的状态供将来使用。最简单的情况可能是尾部递归到循环。关于这个主题的文章很多。

另一方面,从一般迭代算法创建递归版本的研究较少,但它确实存在,

我知道的唯一一件事是,递归可以通过
堆栈同样地转换为非递归,因为它实际上是这样做的,你可以自己做


顺便说一句,您可能会想到一些无法转换为简单迭代的情况。

我不知道执行这种转换的算法的简单、通用的实现,但是使用非常通用的方法来优化递归算法是很简单的

例如,如果您在字典中缓存每个
Factorial
调用的结果(来自
n
->
Factorial(n)
的映射),您将得到一个与迭代算法相同的算法复杂度(但是!只有时间复杂度。此方法使用更多内存).请注意,简单地“模仿”自己的堆栈在算法复杂性方面不会给您带来任何好处

缓存非常容易实现和应用,适用于多种算法


Wikipedia页面上有一个特定的示例算法。

您是否要求使用一个代码转换器,它以特定语言的递归算法作为输入,并返回该语言的迭代算法?@KvanTT:这与您将要使用的语言域密切相关。顺便说一句,与lgorithm。如果我理解正确的话,这是代码的转换,保持它的语义。不要认为CS中还存在这样的工具。@Michael Petrotta,是的。有很多关于如何手动转换的描述,但没有解释如何通过算法来转换。为此,必须在开始时使用解析器。t这是一个简单的从递归到迭代的重写,使用显式堆栈。但是,您不能像上面的示例那样轻松地将一个算法重写为完全不同的算法。它可能适用于某些特殊情况,但可能不适用于一般情况。对于手动转换代码的算法,请看“是”,每个递归都可以是对流的使用堆栈进行迭代非常简单,但在许多情况下,转换为非堆栈版本是可能的(例如阶乘和斐波那契数),而且更有趣、更复杂。