首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归算法:建议的模式和实践?

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

Stack Overflow用户
提问于 2009-06-02 17:35:22
回答 3查看 495关注 0票数 0

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

我的解决方案可能会使用ref参数,看起来像下面这样的伪代码:

代码语言:javascript
复制
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);
}

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-06-02 17:44:09

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

代码语言:javascript
复制
public static bool IsChanged(T current, T previous)
{
    //perform recursion
    if (graphIsChanged)
       return true;
    else
       return IsChanged(current, previous);
}

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

票数 6
EN

Stack Overflow用户

发布于 2009-06-02 17:50:34

尾递归不只是更有效,它还可以防止你在深度递归上打乱堆栈:http://en.wikipedia.org/wiki/Tail_recursion

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

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

票数 4
EN

Stack Overflow用户

发布于 2009-06-02 17:41:31

我一直热衷于从递归函数中获得实际的返回值,而不仅仅是传递对变量的引用。我真的不确定你想在你的样本中做什么,但是为什么不直接从CheckChanged返回一个bool呢?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/940850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档