Fonction ocaml

Résolu
ocaml555 -  
nicocorico Messages postés 846 Statut Membre -
Bonjour,
comment ecrire une fonction en ocaml qui renvoi la liste des diviseur d'un entier
ex: si n =6 alors le resultat sera [1;2;3;6]

8 réponses

  1. doodoo_ch Messages postés 13 Date d'inscription   Statut Membre Dernière intervention  
     
    http://www.pps.jussieu.fr/Livres/ora/DA-OCAML/
    0
  2. ocaml555
     
    merci mais je ne sait pas trop ou trouver la reponse donc ci t'a une idee sur la solution elle est la bienvenu merci
    0
  3. doodoo_ch Messages postés 13 Date d'inscription   Statut Membre Dernière intervention  
     
    désolé mais j'ai seulement 12 ans donc je n'utilise pas de language informatique
    0
    1. nicocorico Messages postés 846 Statut Membre 138
       
      La programmation est sans doute une sorte de drogue, mais de celles que tu peux commencer à 12 ans sans danger !

      Le chêne aussi était un gland, avant d'être un chêne
      0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. KX Messages postés 19031 Statut Modérateur 3 020
     
    Dans un premier temps tu peux regarder cette discussion : langage C nombre parfait, ce n'est pas tout à fait ton sujet mais j'y expliquait comment trouver efficacement les diviseurs d'un entiers, pour l'adapter à ton problème il te faudra rajouter le diviseur à ta liste à chaque fois que moi je le rajoutait à la somme.

    Remarque pour ajouter un nombre à une liste tu peux faire
    1) let liste = element::liste
    2) let liste = liste::[element]
    0
  6. ocaml555
     
    merci mais vue que je ne coné rien au c je ne sais pas vrement comment faire peut tu m'aidez et merc
    0
  7. KX Messages postés 19031 Statut Modérateur 3 020
     
    Si tu arrives au moins à lire mes explications en français, tu comprendras ce que j'ai fait :

    let diviseurs n =
    
        let liste=ref [1;n]
            and r=ref (int_of_float(sqrt(float_of_int n))) in
    
        if !r * !r=n 
        then begin
             liste := !r :: !liste;
             decr(r);
             end;
    
        for i=2 to !r do
            if (n mod i==0)
            then liste:= !liste@[i;n/i];
        done;
    
        !liste;;
    0
  8. ocaml592
     
    eureka g fini par trouvé sufisait juste d'utilisé une rec local
    merci pour ta solution KX mais je la trouve asser longue
    voila la mienne
    let g x=let rec g1 b = if b=1 then[1] else if (x mod b)=0 then b::(g1 (b-1)) else g1 (b-1) in g1 x;;
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      Si tu lis le lien que je t'ai donné, tu verras pourquoi ma fonction est plus longue, c'est pour améliorer le temps de calcul...

      Regarde à partir de 100 000 000, tu n'as peut-être pas besoin de calculer de grandes valeurs, mais savoir optimiser est toujours utile...
      0
    2. ashboy Messages postés 52 Date d'inscription   Statut Membre Dernière intervention  
       
      oui mais bon a mon niveau c'est tous se que je peut faire je ne comprend pas la moitie des fonction que tu a utilisé donc en tant que débutant c tous se dont je suis capable
      0