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 :

listes caml probleme


Sujet :

Caml

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 2
    Points : 1
    Points
    1
    Par défaut listes caml probleme
    bonjour a tous:
    voici mon probleme: comment écrire une fonction qui prenne une liste en argument et qui renvoie le nombre d'écart consécutifs entre deux nombres de la liste égal à deux (en partant du premier):
    exemple fonction [2;3;5;7] renvoie 0
    fonction [2] renvoie 0
    fonction [2;4;6;7] renvoie 2

    voici mon programme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #let rec fonction_phi l = let i=ref 0 in match l with
    |[a]->0
    |[]->0
    |[a;b]-> if b-a=2 then !i+1 else !i
    |a::b::reste-> if b-a<>2 then !i else i:=!i+1;fonction_phi b::reste;!i;;
    mais il ne marche pas!
    merci d'avance

  2. #2
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 46
    Points : 57
    Points
    57
    Par défaut
    Tu devrais éviter d'utiliser une variable lorsque tu programmes avec un langage fonctionnel. Voici une variante (en F#) de ton programme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    > let phi xs =
        let rec _phi xs acc =
            match xs with
            | [] -> acc
            | [x] -> acc
            | x1::x2::xs -> _phi (x2::xs) (if abs(x1 - x2) = 2 then acc + 1 else acc)
        _phi xs 0;;
    Et sinon

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    merci, mais que veut dire acc? apres avoir enlevé le tiret de _phi que caml ne voulait pas, on me renvoie ca..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Toplevel input:
    >    phi xs 0;;
    >    ^^^
    This expression has type int list -> int -> 'a -> 'b,
    but is used with type 'a.

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 46
    Points : 57
    Points
    57
    Par défaut
    acc c'est pour accumulateur. C'est lui est incrémenté à chaque fois que deux nombres successifs de ta liste ont un écart de 2 et c'est lui qui est renvoyé lorsque la condition de sortie est remplie.

  5. #5
    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
    Dim Me As New Idiot > je trouve assez moyen de balancer à un débutant un programme qui ressemble à ce qu'il connaît, mais dont la syntaxe subtilement différente fait qu'il n'arrivera pas à s'en servir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    let phi xs =
        let rec phi' xs acc =
            match xs with
            | [] -> acc
            | [x] -> acc
            | x1::x2::xs -> phi' (x2::xs) (if abs(x1 - x2) = 2 then acc + 1 else acc)
        in
        phi' xs 0;;
    Remarque : la fonction interne peut être nommé phi plutôt que phi', il n'y a aucune possibité de conflit puisque le premier phi n'étant pas récursif, il "n'existe pas" dans le corps de sa déclaration (donc tous les "phi" avant le ";;" font référence au phi local où, s'il n'y en a pas, à une autre variable phi déclarée précédemment). J'ai choisi de distinguer pour éviter les confusions.

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 46
    Points : 57
    Points
    57
    Par défaut
    bluestorm > Tu as raison, ma démarche était maladroite mais je voulais éviter de donner une réponse toute faite alors qu'il s'agissait visiblement d'un exercice.

Discussions similaires

  1. Listes Chainées probleme d'affichage
    Par reapa dans le forum C
    Réponses: 2
    Dernier message: 11/07/2008, 02h38
  2. Réponses: 3
    Dernier message: 17/06/2006, 14h35
  3. Réponses: 1
    Dernier message: 12/02/2006, 17h55
  4. Liste deroulante Probleme Bizar
    Par mael94420 dans le forum ASP
    Réponses: 6
    Dernier message: 23/12/2005, 11h57
  5. Réponses: 11
    Dernier message: 02/05/2005, 19h30

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