J'ai mes fils croisés quelque part (ou je n'ai pas assez dormi). J'ai besoin d'une boucle à double sens, et mon code actuel est tout simplement moche. Problème: Je cours le long d'un datastructre linéaire en utilisant un index. J'ai un index de départ, disons 120. Je veux courir alternativement dans les deux sens.Simplifier/Neatifier cette boucle bidirectionnelle?
Exemple: 120.121.119.122.118.123.117, ...
j'ai un critère d'arrêt qui doit être rencontré pour chaque sens séparément. Si elle est rencontrée dans une direction, je veux seulement courir dans l'autre sens, si les deux sont rencontrés, j'ai besoin de quitter la boucle. De plus, je dois m'arrêter si l'indice suivant est invalide (fin de la structure des données, disons plus petit que 0 ou plus grand que 200). Exemple: Arrêt de l'exécution à 116 vers l'arrière et 130 vers l'avant: 120,121,119,122,118,123,117,124,116 (break), 125,126,127,128,129,130.
En cours d'exécution dans une direction d'abord, puis l'autre n'est malheureusement pas une option.
Mon code actuel est carrément moche. C'est beaucoup de lignes sans contenir de code "productif". Seule la logique d'itération:
int start_idx = 120;
int forward_idx = start_idx;
int backward_idx = start_idx;
bool next_step_forward = true; //should next step be forward or backward?
int cur_idx;
while(backward_idx >= 0 || forward_idx >= 0)
{
if(next_step_forward //if we should step forward
&& forward_idx >= 0) //and we still can step forward
{
cur_idx = ++forward_idx;
if(forward_idx >= 200) //200 is fictive "max index"
{
next_step_forward = false;
forward_idx = -1; //end of data reached, no more stepping forward
continue;
}
if(backward_idx >= 0)
{
next_step_forward = false;
}
}
else if(!next_step_forward
&& backward_idx >= 0)
{
cur_idx = --backward_idx;
if(backward_idx < 0) //beginning of data reached, no more stepping backward
{
next_step_forward = true;
continue;
}
if(forward_idx >= 0)
{
next_step_forward = true;
}
}
else
{
next_step_forward = !next_step_forward; //ever hit?, just security case
continue;
}
//loop body
//do something with cur_idx here
if(stoppingCriterionMet())
{
if(cur_idx > start_idx)
{ //this was a forward step, stop forward stepping
forward_idx = -1;
}
else
{ //this was backward step, stop backward stepping
backward_idx = -1;
}
}
}
Suis-je manque quelque chose? Toutes les astuces appréciées. Merci.
Édition 1: Il y a beaucoup de très belles réponses, qui mettent "faire quelque chose avec cur_idx" dans une fonction séparée. Bien que ce soit une idée parfaite pour la façon dont ma question a été posée, je préfère mettre le code itéré ailleurs et laisser le code productif là. J'ai un long algorithme et je veux le diviser après qu'il soit fini pour minimiser le travail de réaménagement.
Vous devez simplifier votre question. Au lieu de "structure de données linéaire", dites simplement array. Au lieu de "critère d'arrêt", il suffit de rester arrêté. Si vous nettoyez votre question, vous verrez probablement une solution plus propre. –
Si c'est devoirs, vous devriez ajouter cette étiquette –
Désolé pour la question foiré, je vais aller dormir pour résoudre ce problème. Ce n'est pas les devoirs. Quel fou voudrait corriger les solutions proposées par les étudiants? – B3ret