IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Caml Discussion :

fonction d'Ackermann en OCaml


Sujet :

Caml

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 29
    Points : 5
    Points
    5
    Par défaut fonction d'Ackermann en OCaml
    Bonjour à tous,
    Pourriez-vous m'aider à programmer la fonction suivante (en OCaml):

    Fonction d'Ackermann de m et n avec 0≤m,n définie par les équations récursives suivantes:
    A(0,n)=n+1
    A(m+1,0)=A(m,1)
    A(m+1,n+1)=A(m,A(m+1,n))

    profil: (int*int)-> int

    Je pensais m'en sortir avec des "if" en faisant:
    let rec Ackermann (m,n)(int*int):int=
    if m=0 then n+1
    if n=1 then m-1
    La récursivité m'aurait servie pour la dernière equation mais au final je bloque...J'imagine qu'il serait plus judicieux de faire un "match" mais je n'arrive pas à m'en sortir.
    D'avance merci de votre aide.
    Cordialement,
    Mägodeoz

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Non, l'approche avec des if..then..else est très bien -- les débutants se trompent souvent avec le filtrage donc il vaut mieux ne pas en abuser, et s'en servir uniquement sur les structures de données (listes, arbres...).

    Par contre pour obtenir un programme il vaut mieux définir A(m,n) directement au lieu de A(m+1,n+1):

    A(0,n)=n+1
    A(m,0)=A(m-1,1)
    A(m,n)=A(m-1,A(m,n-1))

    Avec cette définition tu devrais pouvoir écrire facilement un programme caml.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 29
    Points : 5
    Points
    5
    Par défaut
    Merci de ta réponse gasche :-)
    Donc je reprends....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    let rec Ackermann (m,n)(int*int):int=
    if m=0 then n+1
    else if n=0 then Ackermann (m-1,1)
    else Ackermann (m-1,Ackermann (m,n-1)) ;;
    C'est correct ou pas...?
    Simple curiosité... En matchant ça aurait donné quoi?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Il y a de petis détails syntaxiques qui clochent : je préfère les noms de variable en minuscule et "let f (m,n)(int*int):int = ..." n'est pas correct, il faudrait écrire "let f (m, n) = ..." ou bien "let f ((m, n) : int * int) : int = ...".

    Pourquoi n'essaies-tu pas de tester ce programme sur de petites entrées pour te convaincre ? Ce n'est pas à nous de te dire si le code est juste, il faut que tu le vérifies toi-même.

  5. #5
    Membre actif
    Avatar de Ptival
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 70
    Points : 276
    Points
    276
    Par défaut
    magodeoz : Pour répondre à la question "C'est correct ou pas...?", la bonne idée de ta part serait de compiler et d'essayer. Certes, ça ne répondra que négativement à ta question, mais c'est déjà une demi-réponse.

    En l'occurence, si comme tu le prétends c'est du OCaml, alors non, ce n'est pas correct, pour plusieurs raisons :

    - le nom d'une fonction doit commencer par une minuscule. (Ackermann -> ackermann)
    - pour préciser le type d'une paire, tu dois écrire ((m, n): int * int)

    Ci-dessous une version avec un match sous une forme spéciale, je te laisse corriger ta version (ne recopie pas celle ci-dessous, écris une version qui fonctionne avec des "if then else" ou avec un "match m, n", et corrige tes annotations de type).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    let rec ackermann = function
      | 0, n -> n + 1
      | m, 0 -> ackermann (m - 1, 1)
      | m, n -> ackermann (m - 1, ackermann (m, n - 1))
    Tu peux tester avec quelques valeurs comme (0, 0), (1, 1), pour te faire une idée de si ton code marche.

    Ensuite, tu peux tester avec des valeurs un peu plus ambitieuses, ce qui devrait t'amener vers un nouveau problème.

  6. #6
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Bonjour,

    C'est cool aussi si tu penses à utiliser les balises CODE pour rendre la lecture plus agréable.

    Encore une autre version de la fonction d'Ackermann, mais en remplaçant les couples (n, m) par deux arguments distincts.

    J'aime beaucoup le résultat ackermann 12 0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let rec ackermann = function
      | 0 -> (+) 1
      | m -> (function 
        | 0 -> ackermann (m - 1) 1 
        | n -> ackermann (m - 1) (ackermann m (n - 1)))
    Cordialement,
    Cacophrène

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 29
    Points : 5
    Points
    5
    Par défaut
    Merci à tous de vos réponses :-) je ne pouvais pas le tester car je suis sous windows...
    Je vais mettre ubuntu sur un disque dur externe et là je pourrais tester
    En effet, je penserais à la balise CODE la prochaine fois ^^

  8. #8
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Et bien Cacophrene ? Pourquoi écrire (+) 1 quand on peut écrire succ ?

  9. #9
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Bonsoir,

    Et bien Cacophrene ? Pourquoi écrire (+) 1 quand on peut écrire succ ?
    Pour voir qui suit dans l'assemblée.

    Cordialement,
    Cacophrène

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

Discussions similaires

  1. [fonction d'Ackermann] Écrire une fonction récursive
    Par java+ dans le forum Mathématiques
    Réponses: 5
    Dernier message: 19/06/2007, 01h14
  2. [OCAML][DEBUTANT] fonction d'entree
    Par oniric dans le forum Caml
    Réponses: 5
    Dernier message: 22/03/2007, 10h16
  3. [Ocaml][debutant] Une fonction qui fait Ci,j
    Par cladsam dans le forum Caml
    Réponses: 2
    Dernier message: 18/03/2007, 19h23
  4. [OCaml] Appel de fonction
    Par raph85 dans le forum Caml
    Réponses: 2
    Dernier message: 23/01/2007, 22h49
  5. La fonction d'Ackermann !
    Par prologO dans le forum Prolog
    Réponses: 14
    Dernier message: 05/12/2006, 17h58

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