我正在编写一个实用程序,它反映了两个对象图并返回一个值来指示图形是否相同。它让我思考,是否有一种普遍接受的模式来编写递归算法,该算法从递归中的某些位置返回值?
我的解决方案可能会使用ref参数,看起来像这样的伪代码:
public static bool IsChanged(T current, T previous)
{
bool isChanged = false;
CheckChanged(current, previous, ref isChanged);
return isChanged ;
}
private static void CheckChanged(T current, T previous, ref isChanged)
{
//perform recursion
if (graphIsChanged)
isChanged = true;
else
CheckChanged(current, previous, ref isChanged);
}
有更好/更清洁/更有效的方式吗?这种功能是否有一般模式?
答案 0 :(得分:6)
与这个非常简单的版本相比,我认为您的版本没有任何好处:
public static bool IsChanged(T current, T previous)
{
//perform recursion
if (graphIsChanged)
return true;
else
return IsChanged(current, previous);
}
作为一个额外的好处,一些编译器能够使用尾调用优化将这个版本变成一个简单的循环,这更有效。
答案 1 :(得分:4)
尾递归不仅更有效,它还可以避免在深度递归时烧掉堆栈: http://en.wikipedia.org/wiki/Tail_recursion
也就是说,它可以防止“Stack Overflow”:)
答案 2 :(得分:0)
我一直喜欢从递归函数中获取实际返回值,而不仅仅是传递对变量的引用。我[你真的不确定你要在你的样本中做什么,但为什么不从CheckChanged返回一个bool?