2012-09-23 6 views
0

J'ai écrit cette fonction pour tracer un certain point dans un arbre topologique. Cependant, pour une raison quelconque. C'est infini.Récursion en utilisant STL?

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

Je débogué les variables d'exécution et je suis certain à 100% que X est différent de (* il) .first. Pourtant, pour une raison quelconque, à chaque appel de fonction suivante, le x reste le même. Dans ce cas (4). Une idée pourquoi?

+0

Juste comme une remarque: Vous pouvez déréférencer l'itérateur comme un pointeur: par ex. 'it-> second.z' est le même que' (* it) .second.z'. (Cela devient un peu compliqué lorsque l'itérateur déréférence à un type de pointeur mais ce n'est pas le cas ici) – Nobody

+0

Combien de clés y a-t-il dans votre map? Se pourrait-il que 'advance 'change' it' pour être l'itérateur 'siet.rend()'? – Nobody

+0

Je le savais :) mais je l'ai appris à mi-chemin. Et d'une certaine manière, c'est devenu ma préférence. –

Répondre

2

Vous obtiendrez une récursion infinie lorsque le multimap contient un élément qui "se réfère" à lui-même ou à un autre élément qui lui "renvoie" directement ou indirectement.

Pour briser la récursion infinie vous avez deux options:

  • assurez-vous qu'il n'y a pas de cycles (s'il y a des fourmis, si possible, de les fixer) puis appeler cette fonction
  • ou garder piste des cycles à l'intérieur de cette fonction.
0

Votre récursivité peut être infinie dans ce cas:

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 
} 

Ainsi, la raison d'être infinie est: cet algorithme est erroné; ou obtenir des données inattendues dans siet

Questions connexes