Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 递归算法:建议的模式和实践?_Algorithm_Recursion_Design Patterns - Fatal编程技术网

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

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);

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

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

有更好/更干净/更有效的方法吗?这样的函数有一个通用模式吗?

我一直喜欢从递归函数中得到一个实际的返回值,而不仅仅是传递一个变量的引用。我不太确定您在示例中要做什么,但为什么不直接从CheckChanged返回bool呢?

与这个非常琐碎的版本相比,我看不出您的版本有什么好处:

public static bool IsChanged(T current, T previous)
{
    //perform recursion
    if (graphIsChanged)
       return true;
    else
       return IsChanged(current, previous);
}

另外一个好处是,一些编译器能够使用尾部调用优化将此版本转换为一个简单的循环,这更有效。

尾部递归不仅更有效,还可以防止在深度递归时破坏堆栈:

也就是说,它可以防止“堆栈溢出”:


谢谢..我不能在我的案例中实际使用它,因为最后一次呼叫是有条件的,取决于当前和先前的形式..但无论如何,这是一个很好的答案和示例