Partage
  • Partager sur Facebook
  • Partager sur Twitter

[OCaml] récursivité

Sujet résolu
    3 décembre 2018 à 23:08:51

    Bonjour,

    je voudrais résoudre un sudoku par la méthode de backtracking, en python et en C je n'ai aucun soucis mais je dois le faire en Ocaml et je viens de passer des heures sur une simple fonction que le compilateur ne veut toujours pas compiler, voici le code en C (tiré directement d'OpenClassroom) ainsi que mon code en OCaml juste en-dessous :
    bool estValide (int grille[9][9], int position)
    {
        // Si on est à la 82e case (on sort du tableau)
        if (position == 9*9)
            return true;
    
        // On récupère les coordonnées de la case
        int i = position/9, j = position%9;
    
        // Si la case n'est pas vide, on passe à la suivante (appel récursif)
        if (grille[i][j] != 0)
            return estValide(grille, position+1);
    
        // A implémenter : backtracking
    }
    
    en OCaml:
    let rec est_valide sudok pos =
    try
    if pos = 81 then raise Exit;
    let i = pos / 9
    and j = pos mod 9 in
    if sudok.(i).(j) <> 0 then est_valide sudok (pos + 1)
    false
    with
    Exit -> true ;;
    J'imagine que c'est pas compliqué mais je comprends plus rien, j'ai essayé de mettre des ';' un peu partout, mais je pense que c'est la deuxième boucle if qui empêche le compilateur de compiler.
    Merci d'avance.
    Bonne soirée.
    • Partager sur Facebook
    • Partager sur Twitter
      4 décembre 2018 à 9:37:50

      Oui, tu t'es bien pris la tête :lol:
      Pas besoin d'exceptions ici :

      let rec est_valide sudok pos =
          if pos = 81 then true
          else
              let i = pos / 9 in
              let j = pos mod 9 in
              if sudok.(i).(j) <> 0 then
                  est_valide sudok (pos + 1)
              else
                  false (* backtracking ici *)
      ;;





      • Partager sur Facebook
      • Partager sur Twitter
        4 décembre 2018 à 9:52:43

        Merci Beaucoup j'avais pas pensé à cette manière :D

        Bien vu ;)

        A+

        • Partager sur Facebook
        • Partager sur Twitter

        [OCaml] récursivité

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown