这两个方法合在一起是不是递归的一种形式?
本文关键字:一种 递归 在一起 两个 方法 是不是 | 更新日期: 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()中,函数都调用自己。然而,每个递归函数都需要一个基本情况,否则它就会无限递归,这就是这里的情况。做功课,有很多网站解释递归。