0
votes

Échouer en récursivité avec des nombres impairs

Je viens d'écrire cette fonction pour imprimer une liste avec les numéros entre A code> et B code>.

int main(){

  list(2, 7);

  return 0;
}


1 commentaires

Il devrait être évident que si les deux chiffres sont impairs, ou les deux sont même, ils deviendront égaux, mais si on est étrange et l'autre même, ils se passeront mutuellement sans égalité. Par exemple, s'ils sont 4 et 5 , ils deviennent ensuite 5 et 4 .


4 Réponses :


0
votes

Comme chaque fois que vous faites une itération, vous ajoutez / ajoute 1 aux deux A et B . Cela signifie que lorsqu'il s'agit d'un nombre impair et d'un numéro de paire A et b ne sera jamais identique. Je vous recommande que lorsque vous commencez à apprendre des algorithmes de base (spécialement pour la récursivion), vous essayez des itérations sur papier.

edit: Une recommandation serait de simplement ajouter une clause de sortie (autre si), où vous quittez Recuruón si A devient plus grand que B (ou vicefersa, en fonction duquel le nombre était supérieur, vous pouvez l'enregistrer dans un booléen).


0 commentaires

0
votes

(2,7)

2 7 3 6 4 5 P>

Lorsque A = 4, B = 5, le suivant est A = 5, B = 4, donc vous avez donc la boucle. p>

Essayez ceci: P>

void list(int a, int b){ 
  if ( ( b-a ) % 2  == 0 ){ // even
    if(a == b){
    printf("%d", a);
  }else{
  if(a < b){
    printf("%d ", a);
    printf("%d ", b);
    list(a + 1, b - 1);
  }// if
    else if(b < a){
      printf("%d ", a);
      printf("%d ", b);
      list(a - 1, b + 1);
    }
  }
}
else { // odd
  if(a < b){
    printf("%d ", a);
    printf("%d ", b);
    list(a + 1, b - 1);
  }  // if
 }
}


0 commentaires

1
votes

C'est parce que ça ne finit jamais. Lorsque la différence entre A et B est étrange, ils n'atteignent jamais la condition == et continue à jamais. Pour résoudre ce problème, vous pouvez vérifier si A et B vont vous passer, Kike this:

void list(int a, int b)
{
    if(a == b)
        printf("%d", a);

    else if(a < b)
    {
        printf("%d ", a);
        printf("%d ", b);
        
        if (a + 1 != b)
            list(a + 1, b - 1);
    }

    else if(b < a)
    {
        printf("%d ", a);
        printf("%d ", b);
        
        if (b + 1 != a)
            list(a - 1, b + 1);
    }
}


0 commentaires

0
votes

Dans chaque tour, lorsque A n'est pas égal à B, vous incrémentez un (de A ou B) et réduisez l'autre. Donc, la différence entre les chiffres diminuent maintenant de 2 (ou d'augmentation de 2). Une observation simple indique que, pour la résiliation de la réapparche de la fonction, les chiffres (A, B) doivent être égaux. Donc, pour que la différence soit 0 (A = B, qui n'appellera plus la fonction), la différence entre A et B dans le démarrage doit être un multiple de 2. Donc, seules les deux ou les deux impairs sont acceptables. Dans d'autres situations, la fonction sera remise à nouveau et à nouveau et une séquence particulière répète (dans votre cas 4 5 5 4)


0 commentaires