π
<-
Chat plein-écran
[^]

Conjecture de Syracuse

Pour le TI-Basic sur Nspire

Conjecture de Syracuse

Message non lude kinkazma » 08 Fév 2020, 04:49

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
Avatar de l’utilisateur
kinkazma
Niveau 8: ER (Espèce Rare: nerd)
Niveau 8: ER (Espèce Rare: nerd)
Prochain niv.: 62.9%
 
Messages: 132
Inscription: 06 Mar 2018, 23:25
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: TS

Re: Conjecture de Syracuse

Message non lude Bisam » 15 Fév 2020, 16:02

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.
Avatar de l’utilisateur
BisamAdmin
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Prochain niv.: 69.6%
 
Messages: 5665
Inscription: 11 Mar 2008, 00:00
Localisation: Lyon
Genre: Homme
Calculatrice(s):
MyCalcs profile


Retourner vers Nspire-Basic

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 8 invités

-
Rechercher
-
Social TI-Planet
-
Sujets à la une
Comparaisons des meilleurs prix pour acheter sa calculatrice !
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
Phi NumWorks jailbreak
123
-
Faire un don / Premium
Pour plus de concours, de lots, de tests, nous aider à payer le serveur et les domaines...
Faire un don
Découvrez les avantages d'un compte donateur !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partenaires et pub
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1278 utilisateurs:
>1256 invités
>18 membres
>4 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Autres sites intéressants
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)