C#中的递归与迭代

时间:2012-01-11 10:14:01

标签: c# recursion

我在最近的一次采访中被问到一个问题,即编写一个递归函数来反转字符串,以及迭代版本是否优于递归函数。我不确定递归解决方案如何比迭代解决方案更差/更好。任何人都可以帮我理解这个吗?

下面的代码不是尾递归的吗?

public static string Reverse(string str)
{
    return (str.Length <= 1 ? str : str[str.Length - 1] 
          + Reverse(str.Substring(0, str.Length - 1)));
}

2 个答案:

答案 0 :(得分:3)

不能保证使用尾递归编译任何东西(尽管x64 .net似乎更倾向于这样做)。如果字符串很长,那么你将会耗尽堆栈。

答案 1 :(得分:1)

检查Optimize标志并使用调试器(ida,olly等)查看代码,以查看编译器对其执行的操作。 这肯定是可能的,但我不打赌他会将递归转换为迭代算法。

一般情况下,应尽可能使用迭代算法,因为它们不太可能耗尽内存/导致堆栈溢出等。 如果它确实有助于理解代码并且没有机会出现堆栈溢出,则可以使用递归