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 :

caml pb de fonction


Sujet :

Caml

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut caml pb de fonction
    Bonjour,

    Actuellement en école d'ingénieur, je dois rendre un projet dans une semaine, mais j'ai un problème avec une fonction.

    Je voudrai faire la fonction combine qui prend en argument 2 listes et retourne une liste de couples av : le 1er élément de la 1ère liste en couple av le 1er élément de la 2e liste etc.
    Le pb est que si la 2e liste est plus petite que la 2e, je voudrais que ça reprenne du début.
    C'est à dire si la 2e liste a 3 éléments et la 1ère liste 4, je voudrai que le dernier élément de la 1ère liste soit de nouveau avec le premier de la 2e.

    Pour l'insant, j'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    let rec combine (p,c) = match (p,c) with
    ([],[]) -> []
      |_,[] -> []
      |[],_ -> []
      | (e1::r1), (e::r) -> (e1,e)::combine (r1,r);;
    merci bcp

  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
    C'est un peu plus délicat.

    J'ai essayé de faire une version pour voir, voici ce que ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    let combine liste_a liste_b =
      let rec comb (p, c) (fin_a, fin_b) = match (p, c) with
      | ([], _) when fin_b -> []
      | (_, []) when fin_a -> []
      | (reste_a, []) -> comb (reste_a, liste_b) (fin_a, true)
      | ([], reste_b) -> comb (liste_a, reste_b) (true, fin_b)
      | (hd1::tl1), (hd2::tl2) -> (hd1, hd2) :: comb (tl1, tl2) (fin_a, fin_b)
      in comb (liste_a, liste_b) (false, false)
    Pourquoi y a-t-il autant d'arguments supplémentaires ? Déjà, pour pouvoir "redonner" la liste au milieu de la fonction (si on arrive à la fin) il faut garder le contenu des deux listes de base. J'ai donc fait deux fonctions imbriquées : seule la fonction interne est récursive, et quelle que soit la valeur de ses arguments p et c tu peux retrouver la valeur des deux listes données initialement en argument, liste_a et liste_b.

    Ensuite, on boucle sur les listes, mais comment savoir quand on s'arrête ?
    La méthode que j'utilise est un couple de booléens, qui indique pour chaque liste si on est déjà arrivé à la fin : par exemple fin_a est vrai si la liste de gauche (liste_a) a déjà été parcourue en entier. Ainsi, quand une des deux listes est vide, il suffit de regarder si l'autre a déjà été parcourue, et dans ce cas on peut s'arrêter. Sinon, il faut continuer en remplacant la liste vide par la valeur initiale de la liste correspondante.

    Mon code me paraît un peu compliqué, il y a sûrement moyen de faire plus cout.

  3. #3
    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
    Aussitôt dit, aussitôt fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    let combine la lb =
      let ta, tb = Array.of_list la, Array.of_list lb in
      let na, nb = Array.length ta, Array.length tb in
      Array.to_list (Array.init (max na nb) (fun i -> ta.(i mod na), tb.(i mod nb)))
    Bon, c'est une méthode assez déloyale

  4. #4
    Membre éclairé
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Points : 803
    Points
    803
    Par défaut
    Miss: soit dit en passant, ta fonction telle qu'elle est actuellement est une implémentation de la fonction zip trouvée dans beaucoup de langages fonctionnels:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Prelude> zip [1, 2, 3, 4, 5] [5, 4, 3, 2, 1]
    [(1,5),(2,4),(3,3),(4,2),(5,1)]
    Prelude>
    zip ne "recommence" pas une liste si elle est plus courte, il arrête là.

  5. #5
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    En OCaml, zip s'appelle combine (et est dans le module List), donc le nom est cohérent.

    --
    Jedaï

Discussions similaires

  1. Composition de fonctions en Caml Light
    Par Palca dans le forum Caml
    Réponses: 15
    Dernier message: 07/01/2008, 14h32
  2. fonction hazard caml
    Par Lulu_n10 dans le forum Caml
    Réponses: 1
    Dernier message: 16/12/2007, 23h38
  3. appel de fonction C en caml
    Par tagazok dans le forum Caml
    Réponses: 10
    Dernier message: 29/06/2007, 09h14
  4. [CAML][GRAPHICS] fonction set_text_size?
    Par fabszn dans le forum Caml
    Réponses: 4
    Dernier message: 27/04/2007, 10h46
  5. Réponses: 3
    Dernier message: 11/03/2006, 15h35

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