迭代递归或反之亦然算法存在效率输出和尾递归吗?
优先考虑的是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;
}
答案 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。