Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2018
    Messages : 5
    Points : 5
    Points
    5

    Par défaut Les tours de Hanoi Ocaml, problème de programme.

    Bonjour,
    j'ai essayé de résoudre l'exemple classique des tours de hanoi en ocaml, j'ai écrit le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    let deplacement position1 position2 =
      print_string ("bouge le disque de " ^ position1 ^ " vers " ^ position2);
      print_newline ();;
    let rec hanoi debut milieu arrivee n = function
      | 0 -> ()
      | n ->
        hanoi debut arrivee milieu (n - 1) ;
        deplacement debut arrivee;
        hanoi milieu debut arrivee (n - 1) ;;
    hanoi "A" "B" "C" 4;;
    j'obtiens l'erreur que je ne comprends pas :
      hanoi debut arrivee milieu (n - 1) ;
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    Warning 5: this function application is partial,
                             maybe some arguments are missing.
                                                        Characters 145-179:
                               hanoi milieu debut arrivee (n - 1) ;;
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    Error: This expression has type int -> unit
        but an expression was expected of type unit
      >>>hanoi "A" "B" "C" 4;;
    Characters 0-5:
      hanoi "A" "B" "C" 4;;
    ^^^^^
    Error: Unbound value hanoi
           >>>    ^
        Error: Syntax error
                           >>>hanoi "A" "B" "C" 4;;
    Characters 0-5:
      hanoi "A" "B" "C" 4;;
    ^^^^^
    Error: Unbound value hanoi
    Je ne comprends pas, je pense pourtant avoir donné tout les argument.
    Pouvez-vous m'aider?

  2. #2
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    juin 2007
    Messages
    1 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : juin 2007
    Messages : 1 679
    Points : 2 924
    Points
    2 924

    Par défaut utiliser if partout où c'est possible

    Je ne comprends pas
    C'est vrai qu'Ocaml n'est pas tendre avec les débutants.

    Le plus simple pour un débutant c'est de ne pas utiliser ce qu'il comprend mal. En général un grand débutant comprend mal match et encore plus mal function.

    À quoi servent match / function ? À déconstruire une donnée algébrique. Est-ce que n:int est une donnée algébrique ? Non, c'est juste un entier et donc tu peux utiliser if pour le déconstruire.
    Code ocaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    let deplacement position1 position2 =
      print_string ("bouge le disque de " ^ position1 ^ " vers " ^ position2);
      print_newline ();;
    let rec hanoi debut milieu arrivee n =
      if n > 0 then begin
        hanoi debut arrivee milieu (n - 1);
        deplacement debut arrivee;
        hanoi milieu debut arrivee (n - 1)
      end;;
    hanoi "A" "B" "C" 4;;
    Et voilà ça n'est pas plus compliqué que ça. Il n'y a pas besoin de match / function.

    Il faudrait presque le mettre dans une FAQ :
    1. utiliser if partout où c'est possible.
    2. utiliser match / function uniquement pour déconstruire une donnée algébrique.
    3. pareil avec when, ne l'utilisez pas là où un simple if ferait l'affaire.
    Du même auteur: le cours OCaml, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2018
    Messages : 5
    Points : 5
    Points
    5

    Par défaut

    Merci de votre réponse,
    mais le but ici était bel et bien d'utiliser function, pas vraiment le problème de hanoi que j'avais déja résolu dans un autre language.
    J'ai trouvé la solution a mon problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    let deplacement position1 position2 =
      print_string ("bouge le disque de " ^ position1 ^ " vers " ^ position2);
      print_newline ();;
    let rec hanoi debut milieu arrivee = function
      | 0 -> ()
      | n ->
        hanoi debut arrivee milieu (n - 1) ;
        deplacement debut arrivee;
        hanoi milieu debut arrivee (n - 1) ;;
    hanoi "A" "B" "C" 4;;
    Merci en tout cas pour vos conseils !

  4. #4
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    juin 2007
    Messages
    1 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : juin 2007
    Messages : 1 679
    Points : 2 924
    Points
    2 924

    Par défaut mea culpa

    Okay, j'ai appliqué le principe KISS alors que ça n'était pas la réponse attendue

    À l'avenir je vais tâcher de modifier ton code le moins possible afin de mieux respecter tes choix personnels (au lieu d'imposer les miens).
    Du même auteur: le cours OCaml, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de programme ocaml
    Par Unglaublicher dans le forum Caml
    Réponses: 3
    Dernier message: 31/12/2018, 14h35
  2. Réponses: 5
    Dernier message: 10/04/2017, 01h35
  3. Réponses: 1
    Dernier message: 03/04/2017, 17h17
  4. [OCaml] Problème de structure/parser
    Par marv1 dans le forum Caml
    Réponses: 4
    Dernier message: 09/05/2005, 13h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo