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 :

probleme avec sub_vect


Sujet :

Caml

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 8
    Par défaut probleme avec sub_vect
    Bonjour,
    J'ai un probleme en caml light.
    Pour un programme je dois insérer un élément dans un tableau pour cela je le coupe en deux avec la fonction sub_vect avec deux fonctions auxilliaires
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let aux1 (t:int vect) (i:int)=
    sub_vect t 0 i;;
    cette fonction ne pose pas de problème, par contre, pour la deuxieme
    let aux2 (t:int vect) (i:int)=
    let p=vect_length t in
    sub_vect t i+1 p-2-i;;
    il semble y avoir un probleme de type car il me renvoit à propos de sub_vect... cette expression est de type int->int vect mais est utilisée avec le type int.
    merci d'avance

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    et comme cela ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sub_vect t (i+1) (p-2-i)
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 8
    Par défaut
    merci beaucoup et désolée pour cette question!

  4. #4
    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
    Petite remarque : on ne coupe JAMAIS un tableau pour y insérer un élément. C'est une habitude de bonne programmation/algorithmie : si tu dois faire ainsi, ça veut dire que tu n'utilises pas le tableau comme il faut. C'est justement l'une des principales caractéristiques des tableaux : pouvoir accéder à un élément quelconque, à la différence des listes.

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Par défaut sub_vect
    Citation Envoyé par hortensiass Voir le message
    merci beaucoup et désolée pour cette question!
    Où insérer l'élément ? à un rang ?
    voici une réponse possible avec une liste v, (insérer x au rang r) :

    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
    let v=1::2::3::4::5::[];;
    let r=1;;
    let rec insert x = fun 
       [] -> [] 
      | (a::q) -> (
          if list_length q = (list_length v)-r 
          then x::a::q 
          else a :: (insert x q)
        )
    ;;
    insert 9 v;;
     
    let rec insert1 x = function
    [] -> [x]
    | t::q when list_length q = list_length v -r -> x::t::q
    | t::q -> t :: (insert1 x q);;
    insert1 9 v;;

  6. #6
    Expert confirmé
    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
    Par défaut
    Citation Envoyé par phryte Voir le message
    Où insérer l'élément ? à un rang ?
    voici une réponse possible avec une liste v, (insérer x au rang r) :
    Sauf que : ta liste v est fixe, ton rang aussi, tu utilises 2 list_length à chaque itération... En bref ton algo est en O(r*n) et ton implémentation n'est pas pratique à réutiliser.

    Une solution en O(r) et réutilisable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let rec insert r x ys = 
      if r = 0 
      then x :: ys 
      else match ys with
        | [] -> []
        | t :: q -> t :: insert (r-1) x q
    --
    Jedaï

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Par défaut
    Allez hop.. deux autres versions.

    Une tail-recursive
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    let insert_2 r x ys = 
        let rec insert_aux r element liste tete =
            if r = 0
            then List.rev_append tete (element :: liste) 
            else match liste with
                | [] -> ys
                | t :: q -> insert_aux (r-1) element q (t :: tete)
        in
            insert_aux r x ys []
        ;;
    et une par continuation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    let insert_3 r x ys =
        let rec insert_aux r element liste k =
            if r = 0
            then k (element :: liste)
            else match liste with
                | [] -> ys
                | t :: q -> let k0 = fun l -> (k (t::l))
                            in
                                insert_aux (r-1) element q k0
        in
            insert_aux r x ys (fun x -> x)
        ;;

Discussions similaires

  1. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  2. Problèmes avec le filtrage des ip
    Par berry dans le forum Réseau
    Réponses: 9
    Dernier message: 30/12/2002, 07h51
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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