是否存在迭代递归或反之亦然算法?

时间:2012-09-16 19:02:16

标签: 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 <= n; i++)
        result = result * i;
    return result;
}

3 个答案:

答案 0 :(得分:2)

是的,总是可以从递归算法创建迭代版本。我不知道C#是否存在程序/代码重写器。这种技术已得到很好的研究,你可以找到像From recursion to iteration: what are the optimizations? (pdf file)这样的一般参考文献 最糟糕的情况是简单地“模拟”堆上的堆栈以保存函数的状态以供将来使用。最简单的情况可能是循环尾递归。有很多关于这个主题的文章 另一方面,从一般迭代算法创建递归版本的研究较少,但肯定存在,

答案 1 :(得分:0)

我唯一知道的是,递归可以用stack平均转换为非递归,因为它实际上是这样做的,你可以自己做。

不过,你可能会想到一些无法转换为简单迭代的情况。

答案 2 :(得分:0)

我不知道执行这种转换的算法的简单,通用,实现,但使用dynamic programming方法优化递归算法是微不足道的通用的。

例如,如果您缓存每个Factorial来自词典n - &gt; Factorial(n)的地图中的结果,您将会得到一个算法复杂度,它等于迭代算法(但是只有时间复杂度。在这个方法中使用了更多的内存)。请注意,简单地“模仿”您自己的堆栈在算法复杂性方面没有任何帮助。

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

Wikipedia页面在您的示例算法上有一个特定的entry