递归算法:建议的模式和实践?

时间:2009-06-02 17:35:22

标签: algorithm recursion design-patterns

我正在编写一个实用程序,它反映了两个对象图并返回一个值来指示图形是否相同。它让我思考,是否有一种普遍接受的模式来编写递归算法,该算法从递归中的某些位置返回值?

我的解决方案可能会使用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);
}

有更好/更清洁/更有效的方式吗?这种功能是否有一般模式?

3 个答案:

答案 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”:)

http://en.wikipedia.org/wiki/Stack_overflow

答案 2 :(得分:0)

我一直喜欢从递归函数中获取实际返回值,而不仅仅是传递对变量的引用。我[你真的不确定你要在你的样本中做什么,但为什么不从CheckChanged返回一个bool?