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 :

Entrainement sur listes.


Sujet :

Caml

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 24
    Par défaut Entrainement sur listes.
    Bonsoir,

    Je m'entraine (étant un gros débutant) sur les listes pour pouvoir je l'espère bientot, implémenter des algorithmes de tri en OCaml. Pour cela j'ai regardé des tps/ tds sur le net en essayant de faire quelques exercices.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    (* Taille d'une liste *)
    let rec size = function
      |[] -> 0
      |h::q -> 1 + (size q);;
     
    (* Est dans une liste *)
    let rec inl x = function
      |[] -> false
      |h::q -> if t = x then true else (inl x q);;
     
    (*ajouter à la fin*)  
    let rec add x = function
      |[] -> [x]
      |h::q -> h::(add x q);;
     
    (*somme d'une liste *)
    let rec somme = function
      |[] -> 0
      |h::q -> h + (somme q);;
    Auriez vous des idées de nouveaux exercices?
    Je dois vous avouer que je suis bloqué au mirroir (inverser une liste), et à l'insertion d'un nombre dans une liste ordonné.

    Bonne soirée

  2. #2
    Membre émérite
    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
    Par défaut
    Salut !

    D'abord quelques remarques sur les codes que tu nous donnes, avec des idées d'exercices qui en découlent :

    Fonction size : Sais-tu quel est le comportement de cette implémentation lorsqu'on lui donne une très longue liste (par ex. 500 000 éléments) en entrée ? Si ce n'est pas le cas, tu peux tester avec make (création de liste) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let make n x =
      let rec loop res i =
        if i < n then loop (x :: res) (i + 1)
        else res
      in loop [] 0
    Idée d'exercice : réécrire size pour éviter ce comportement. Au besoin s'inspirer de la fonction make donnée ci-dessus. Comment appelle-t-on les fonctions écrites de cette manière ?

    Fonction inl (communément appelée mem) : OCaml dispose d'opérateurs booléens OU (noté ||) et ET (noté &&) paresseux. En conséquence : dans A OU B, B n'est évalué que si A est faux; dans A ET B, B n'est évalué que si A est vrai.

    Idée d'exercice : peut-on exploiter la propriété de l'opérateur OU pour écrire autrement la fonction inl ? Comment faire pour que la fonction de comparaison utilisée puisse être choisie par l'utilisateur ? Comment appelle-t-on une fonction qui reçoit une autre fonction en entrée ? Connais-tu d'autres fonctions de ce type ?

    Fonction add (en fait ce serait append par opp. à prepend) : Même problème que la fonction size.

    Idée d'exercice : Peut-on faire autrement ? Quelle est la conséquence d'une écriture « à la make (ci-dessus) » ? Que faut-il en conclure sur la stratégie d'insertion dans une liste en OCaml ?

    Fonction somme : exactement la même chose que size.

    Je dois vous avouer que je suis bloqué au mirroir (inverser une liste)
    Avec ce que tu as dû observer si tu as essayé de réécrire add comme indiqué plus haut, tu dois savoir comment faire.

    insertion d'un nombre dans une liste ordonnée
    Faut-il déterminer cette relation d'ordre ? Si oui, est-ce possible quel que soit le contenu de la liste ?

    Cordialement,
    Cacophrène

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 24
    Par défaut
    Merci énormément pour ta réponse je vais essayer de faire tout ça aujourd'hui et je viendrai mettre mes résultats

    Bonne journée

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Par défaut
    Comme exercice sur les listes, tu peux recoder l'ensemble des fonctions du module List : documentation du module List.

    Pour la fonction "rev" qui inverse les listes, tu devrais commencer par coder une fonction intermédiaire plus simple à trouver : c'est la fonction "renverse_dans", qui prend en paramètres deux listes "a" et "b", et qui ajoute à "b" tous les éléments de a, un par un (indice : faire une récursion en faisant un filtrage sur "a").

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12
    Par défaut
    - réécrire la fonction somme en utilisant la fonction List.fold_left

  6. #6
    Membre Expert
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Par défaut
    Plus simple : écrire une fonction de concaténation (la même chose que @) récursive terminale, c'est-à-dire pouvant fonctionner correctement avec n'importe quel nombre d'éléments.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 24
    Par défaut
    Bonsoir,

    J'ai beau me retourner la tête dans tous les sens, rien y fait. Tous ces exercices j'arrive a les faire en C ou encore Java, mais en OCaml je sais pas pourquoi, je n'ai aucun déclic. J'ai passé toute ma journée avec un crétarium et mon cahier de brouillon mais non, je sais pas ma logique est surement très mauvaise.

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Par défaut
    Pour la fonction "rev" qui inverse les listes, tu devrais commencer par coder une fonction intermédiaire plus simple à trouver : c'est la fonction "renverse_dans", qui prend en paramètres deux listes "a" et "b", et qui ajoute à "b" tous les éléments de a, un par un (indice : faire une récursion en faisant un filtrage sur "a").
    Code ocaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let rec renverse_dans a b = match a with
    | [] -> b
    | tete::queue -> renverse_dans ... ...

    Tu peux le faire !

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 24
    Par défaut
    J'ai reussi à mettre un élément dans une liste trié.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    let rec add x list  =
      match list with
      |[] -> x :: list
      |head :: queue -> if x < head then x :: list
      			 else add x queue;;
    Si x est inférieur à la tête, j'ajoute x et head :: queue soit list. Malheuresement il ne me retourne que ce qu'il y a après l'ajout.
    Comment faire pour qu'il me récupère le bout de liste avant? Je vois toujours pas car avec la récursion ce qui a avant est 'coupé' non?

    Je me lance dans ton exo BlueStorm!
    Comment faire pour atteindre la liste de b? b[x]?
    Merci encore pour votre aide.

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

Discussions similaires

  1. [VB]Double clique sur liste...
    Par STRUFIELD dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 23/01/2006, 13h43
  2. Réponses: 3
    Dernier message: 23/01/2006, 11h43
  3. Selection clavier sur liste déroulante
    Par Maxime_ dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 12/01/2006, 10h35
  4. Réponses: 2
    Dernier message: 26/10/2005, 16h51
  5. [langage] random sur liste ou tableau
    Par martijan dans le forum Langage
    Réponses: 2
    Dernier message: 15/07/2003, 14h47

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