Fonction ocaml

Résolu
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. http://www.pps.jussieu.fr/Livres/ora/DA-OCAML/
    0
    1. 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
      1. désolé mais j'ai seulement 12 ans donc je n'utilise pas de language informatique
        0
        1. 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
      2. Modérateur
        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
        1. merci mais vue que je ne coné rien au c je ne sais pas vrement comment faire peut tu m'aidez et merc
          0
          1. Modérateur
            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
            1. 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. Modérateur
                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. 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