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);
}

実行時に変数をデバッグしましたが、X が (*it).first とは異なることは 100% 確信しています。しかし、何らかの理由で、次のすべての関数呼び出しで 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 に答える