Page 1 sur 1

Conjecture de Syracuse

Message non luPosté: 08 Fév 2020, 04:49
de kinkazma
Bonjour,

Je viens de publier un programme et je voudrais éviter de propager de mauvaises solutions à une conjecture. Je l’ai comparé aux résultats du site Dcode : https://www.dcode.fr/conjecture-syracuse

Voici un lien vers mon programme :
http://ti-pla.net/a2585235

Je suis "étudiant" en Terminale S, tout conseil est le bien venu.

Je sais bien que les puristes veulent un joli While, ce que j’aurais très bien pu faire, mais cela me plaisait de procéder de la sorte.
Sinon, je ne fais pas de fautes particulières ?

Je me suis demandé si je devais mettre absolument tous les résultats des étapes dans une liste, mais j’ai jugé cela inutile ; alors, ne l’aie pas fait. Ai-je eu tort ?

Je vous remercie pour votre aide généreuse jusqu’à présent.
Code: Tout sélectionner
Define LibPub syracuse(n)=
//Version 1.0
Prgm
k:=1
p:=n
Disp "For :",n
Disp " "
Lbl a
If ((n+1)/(2))≠floor(((n+1)/(2))) Then
((n)/(2))→n
  Disp n
  k+1→k
Else
  3*n+1→n
  Disp n
  k+1→k
EndIf
If n=1 Then
  Disp "Étapes :",k
  l1:={p,k}
  DelVar n,k,p
  Stop
EndIf
Goto a
EndPrgm

Code: Tout sélectionner
Define LibPub syracuse(n)=
//Version 1.3
Prgm
If n=0 Then
  n:=floor(((randInt(9,2000000000))/(2))+1)
EndIf
k:=1
p:=n
g:=n
Disp "For :",n
Disp " "
Lbl a
If ((n+1)/(2))≠floor(((n+1)/(2))) Then
((  n)/(2))→n
  If n>g Then
   g:=n
  EndIf
  Disp n
  k+1→k
Else
  3*n+1→n
  If n>g Then
   g:=n
  EndIf
  Disp n
  k+1→k
EndIf
If n=1 Then
  Disp "For :",p
  Disp "Max altitude :",g
  Disp "Flying time :",k
  l1:={p,g,k}
  DelVar n,k,p,g
  Stop
EndIf
Goto a
EndPrgm

Code: Tout sélectionner
Define LibPub syracuse(n)=
//Version 1.4
Prgm
©Ce sont des nombres qui donnent de grandes valeurs maximums et un temps de vol assez long, ou bien dont le déroulement d’étapes de calculs est amusant à regarder en détail.
©syracuse(10709980568908647)
©syracuse(87381)
If n=−1 Then
  n:=floor(((randInt(−1000000000000,−1))/(2))+1)
EndIf
If n=0 Then
  q:=9
  m:=80000000000000
  Request "Minimum rand :",q,0
  Request "Maximum rand :",m,0
  n:=floor(((randInt(q,m))/(2))+1)
EndIf
If n=1 Then
  n:=floor(((randInt(9,88888888888888))/(2))+1)
EndIf
If n=2 Then
  n:=floor(((randInt(9,1000000000000))/(2))+1)
EndIf
k:=1
p:=n
g:=n
b:=n
Disp "For :",n
Disp " "
Lbl a
If ((n+1)/(2))≠floor(((n+1)/(2))) Then
((n)/(2))→n
  If n>g Then
   g:=n
  EndIf
  If n<b Then
   b:=n
  EndIf
  Disp n
  k+1→k
Else
  3*n+1→n
  If n>g Then
   g:=n
  EndIf
  If n<b Then
   b:=n
  EndIf
  Disp n
  k+1→k
EndIf
If n=1 Then
  Disp "For :",p
  Disp "Max altitude :",g
  Disp "Flying time :",k
  l1:={p,g,k}
  DelVar n,q,m,k,p,g,b
  Stop
EndIf
If n=−5 Then
  Disp "For :",p
  Disp "Min altitude :",b
  Disp "Flying time :",k
  l2:={p,b,k}
  DelVar n,q,m,k,p,g,b
  Stop
EndIf
Goto a
EndPrgm

Re: Conjecture de Syracuse

Message non luPosté: 15 Fév 2020, 16:02
de Bisam
Il y a plein de mauvais usages dus au fait que tu débutes en programmation... et par conséquent, il vaut mieux que tu les corriges au plus tôt.

  1. Tu utilises des variables globales au lieu de variables locales, autrement dit tu stockes tes variables à l'extérieur de ton programme et tu es obligé de les effacer à la main. Il vaut mieux écrire Local variable1, variable2, variable3,... au début de ton programme et tes variables seront automatiquement effacées à la fin de ton programme.
  2. Tu utilises des Goto, ce qui est une pratique hautement déconseillée depuis plus de 30 ans ! Ce n'est pas tellement dû à une lenteur d'exécution ou à une mauvaise méthode mais surtout au fait qu'il devient extrêmement difficile de lire et comprendre ce que fait le code, en particulier si tes noms de Labels ne sont pas explicites.
  3. Tu n'utilises pas du tout les propriétés des entiers et tu fais à la place des calculs sur les nombres réels. C'est une très mauvaise pratique qui peut engendrer des erreurs colossales quant elle est utilisée à mauvais escient. Ici, cela a peu d'importance car tu ne t'en sers que pour vérifier si un nombre est pair... mais il existe des méthodes bien meilleures et BEAUCOUP plus efficaces. Tu devrais revoir la notion de division euclidienne, et en particulier la fonction mod.
  4. Tu écris ton programme d'un seul bloc alors que tu devrais utiliser des fonctions appelées par un programme principal. En gros, le programme principal pourrait se contenter d'afficher les résultats intermédiaires tandis que les fonctions pourraient calculer le terme suivant de la suite et mettre à jour le temps de vol, les minimum et maximum d'altitude, etc...
  5. Tu utilises des noms de variable d'une seule lettre alors que tu peux utiliser des noms explicites de plusieurs lettres. Même si ici, c'est compréhensible, cela peut très vite devenir très gênant pour la compréhension de ce que fait ton programme.

Bref, ton programme fonctionne et c'est déjà une bonne chose, mais il y a encore beaucoup d'améliorations possibles.