Bonjour, j'ai une suite de Syraccuse à programmer en CAML.
Malheureusement je ne la réussit pas et je ne comprends pas pourquoi ça ne marche pas, quelqu'un peut-il m'aider?
Je dois programmer la suite de Syraccuse pour une certain n (si n est pair on divise par 2 s'il est impaire on multiplie par 3 et on rajoute 1)
et trouver au bout de combien de rang j'ai le premier 1
Je vous écris mon programme:
let coll n =
let s = ref n; let p = ref 0 in
while !s<>1 do
if (n mod 2=0) then s:=!s/2 p:=!p+1 else s=!s*3+1
done;
!p
;;
Merci d'avance!
édit Océane : forum modifié
je m'aperçois qu'à la fin j'ai oublié une partie
let coll n =
let s = ref n; let p = ref 0 in
while !s<>1 do
if (n mod 2=0) then s:=!s/2 p:=!p+1 else s:=!s*3+1 p:=!p+1
done;
!p
;;
Puis-je mettre des and?
let coll n =
let s = ref n and let p = ref 0 in
while !s<>1 do
if (n mod 2=0) then s:=!s/2 and p:=!p+1 else s:=!s*3+1 and p:=!p+1
done;
!p
;;
Salut !
" if (n mod 2=0)" <<< le problème est là, c'est pas n qu'il faut tester mais !s...
apres j'ai pas fait de caml depuis longtemps mais je suis pas tres sur que le teste d'égalité soit "=" est pas quelque chose comme "==" (y a bcp de language pour lesquel le teste d'égalité est ==, le symbole = étant réservé à l'assignation...)
Si ca marche toujour pas, dit ce que le logiciel répond précisement, parceque j'ai pas caml sous la main pour essayer...
pour ce qui est des "and" : non surement pas. si on en met c'est entre des condition dans un teste, pas entre des instructions.
sinon caml à toujour été assez chiant, donc dans le doute rajoute des paranthèses :p
petit problème aussi sur la suite de syracuse
longueur syracuse n=
let s= ref 0 in
while n<1 do s+1
if (n mod 2 == 0) then n/2
else n*3+1
done;
!s
;;
je comprend pas ce qui ne convient pas
Bonjour,
Voici un programme CAML qui répond à votre recherche.
let rec inserer s nb = match s with
| []->[nb]
| a::suite -> a::inserer suite nb;;
let rec nbsyracuse nb =
if (nb mod 2 = 0) then nb/2 else nb*3+1;;
let suitesyracuse nb =
let nb1=ref(nb) and s=ref([nb]) in
while !nb1<>1 do
nb1:=nbsyracuse !nb1;
s:=inserer !s !nb1;
nb1:=!nb1
done;
!s;;
Si vous avez besoin d'autres renseignements sur ce sujet, vous pouvez m'envoyer un message.
Amicalement.
Vous devez être membre accéder à ce service...
Pas encore inscrit ?
1 compte par personne, multi-compte interdit !
Ou identifiez-vous :