这两种方法是否都是一种递归形式?

时间:2014-08-21 05:32:44

标签: java c# .net loops recursion

我有两个方法,第一个方法从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#。

5 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

  

这是一种递归形式吗?

是;这是相互递归

  

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

  

有没有办法进行迭代?

是。所有递归算法都有迭代形式,所以这个算法就是这样。我注意到,不要求迭代形式易于查找或易于理解。然而,在这种情况下,迭代算法是众所周知的;这是深度优先树遍历。对此进行网络搜索,您将快速学习如何使用显式堆栈或显式队列来迭代地管理树遍历。

答案 2 :(得分:1)

这不是直接递归,因为递归定义为方法调用自身。但在你的情况下,有间接递归。所以,是的,你冒着StackOverFlowError

的风险

答案 3 :(得分:0)

是的,这很简单:

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

答案 4 :(得分:-3)

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