Algorithm 递归算法:建议的模式和实践?
我正在编写一个实用程序,它反映两个对象图,并返回一个值来指示这些图是否相同。它让我思考,是否有一个普遍接受的模式来编写递归算法,从递归中的某个地方返回值 我的解决方案可能会使用ref参数,类似于以下伪代码:Algorithm 递归算法:建议的模式和实践?,algorithm,recursion,design-patterns,Algorithm,Recursion,Design Patterns,我正在编写一个实用程序,它反映两个对象图,并返回一个值来指示这些图是否相同。它让我思考,是否有一个普遍接受的模式来编写递归算法,从递归中的某个地方返回值 我的解决方案可能会使用ref参数,类似于以下伪代码: public static bool IsChanged(T current, T previous) { bool isChanged = false; CheckChanged(current, previous, ref isChanged);
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);
}
有更好/更干净/更有效的方法吗?这样的函数有一个通用模式吗?我一直喜欢从递归函数中得到一个实际的返回值,而不仅仅是传递一个变量的引用。我不太确定您在示例中要做什么,但为什么不直接从CheckChanged返回bool呢?与这个非常琐碎的版本相比,我看不出您的版本有什么好处:
public static bool IsChanged(T current, T previous)
{
//perform recursion
if (graphIsChanged)
return true;
else
return IsChanged(current, previous);
}
另外一个好处是,一些编译器能够使用尾部调用优化将此版本转换为一个简单的循环,这更有效。尾部递归不仅更有效,还可以防止在深度递归时破坏堆栈: 也就是说,它可以防止“堆栈溢出”:
谢谢..我不能在我的案例中实际使用它,因为最后一次呼叫是有条件的,取决于当前和先前的形式..但无论如何,这是一个很好的答案和示例