0

我编写了这个函数来跟踪拓扑树中的某个点。然而由于某种原因。它的无限。

int electricity(int x){
    multimap<int,entita,greater<int> >::reverse_iterator it = siet.rbegin();
    advance(it,x-1);
    if((*it).second.z=='E') return (*it).second.i;
    return electricity((*it).first);
}

我在运行时调试了变量,我 100% 确定 X 不同于 (*it).first。然而由于某种原因,每次调用下一个函数时,x 都保持不变。在这种情况下(4)。知道为什么吗?

4

2 回答 2

2

当多重映射包含一个“引用”自身的项目或另一个直接或间接“引用”回它的项目时,您将获得无限递归。

要打破无限递归,您有几个选择:

  • 确保没有循环(如果可能的话,如果有蚂蚁,修复它们)然后调用这个函数
  • 或跟踪此函数内的循环。
于 2012-09-23T10:56:41.900 回答
0

在这种情况下,您的递归可能是无限的:

int electricity(int x){ // You call with some X
   multimap<int,entita,greater<int> >::reverse_iterator it = siet.rbegin();
   advance(it,x-1); // Now *it at some element, lets call it Z
   if((*it).second.z=='E') // False for Z
      return (*it).second.i;
   return electricity((*it).first); // Call himself with same X, e.g. X == it->first
}

所以,无限的理由是:这个算法是错误的;或获取意外数据siet

于 2012-09-23T14:23:13.147 回答