这两个方法合在一起是不是递归的一种形式?

本文关键字:一种 递归 在一起 两个 方法 是不是 | 更新日期: 2023-09-27 18:18:51

我有两个方法,第一个方法从forloop中调用第二个方法,但第二个方法用子项id调用第一个方法。这是一种递归吗?虽然相同的方法不调用自身,但是否存在堆栈溢出的风险或与普通递归方法相关的任何其他问题?

void AddItems(int id)
{
   var items = GetItems(id);
   foreach (var item in items)
   {
      AddItem(item);
   }
}
void AddItem(Item item)
{
   DoSomething(item);
   AddItems(item.subItemId);
}

编辑:有没有一种方法可以让它迭代?我用的是c#

这两个方法合在一起是不是递归的一种形式?

根据经验,如果它直接或间接地在相同或不同的数据上调用自己,则递归。

除非它是尾递归的(这不是),否则递归容易导致堆栈溢出。特别是,如果subItemId与其父ID相同,则会导致循环,从而导致SO。

是递归的一种形式吗?

是的;这是相互递归

是否存在堆栈溢出的风险或其他可能与普通递归方法相关的问题?

是的。

是否有方法使其迭代?

是的。所有的递归算法都有迭代形式,这个也是。我注意到迭代形式并不要求容易找到或容易理解。在这种情况下,迭代算法是众所周知的;这是一个深度优先树遍历。在网上搜索一下,你会很快学会如何使用显式堆栈或显式队列来迭代地管理树遍历。

这不是直接的递归,因为递归被定义为方法调用自己。但是在你的例子中,有一个间接的递归。所以,是的,你有StackOverFlowError的风险

是的,这很简单:

void AddItems(int id) {
    tempID = id;
    bool loop = true;
    while(loop) {
        var items = GetItems(id);
        for each(var item in Items) {
            DoSomething(item);
            id = item.subitemID;
            continue;
        }
        loop = false;
    }
}

还没有测试过,但应该能奏效…您可能还想看一下GOTO语句http://msdn.microsoft.com/en-IN/library/13940fs2.aspx

函数调用自身时发生递归。在这两个void item()中,函数都调用自己。然而,每个递归函数都需要一个基本情况,否则它就会无限递归,这就是这里的情况。做功课,有很多网站解释递归。