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

Pra*_*bhu 1 .net c# java recursion loops

我有两个方法,第一个方法从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);
}
Run Code Online (Sandbox Code Playgroud)

编辑:有没有办法进行这种迭代?我正在使用C#.

Ale*_*ler 5

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

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

  • 我注意到C#编译器没有检测和优化尾递归算法,尽管在某些情况下抖动可以这样做. (2认同)