我在最近的一次采访中被问到一个问题,即编写一个递归函数来反转字符串,以及迭代版本是否优于递归函数。我不确定递归解决方案如何比迭代解决方案更差/更好。任何人都可以帮我理解这个吗?
下面的代码不是尾递归的吗?
public static string Reverse(string str)
{
return (str.Length <= 1 ? str : str[str.Length - 1]
+ Reverse(str.Substring(0, str.Length - 1)));
}
答案 0 :(得分:3)
不能保证使用尾递归编译任何东西(尽管x64 .net似乎更倾向于这样做)。如果字符串很长,那么你将会耗尽堆栈。
答案 1 :(得分:1)
检查Optimize标志并使用调试器(ida,olly等)查看代码,以查看编译器对其执行的操作。 这肯定是可能的,但我不打赌他会将递归转换为迭代算法。
一般情况下,应尽可能使用迭代算法,因为它们不太可能耗尽内存/导致堆栈溢出等。 如果它确实有助于理解代码并且没有机会出现堆栈溢出,则可以使用递归