π
<-
Chat plein-écran
[^]

Conjecture de Syracuse

Pour le TI-Basic sur Nspire

Conjecture de Syracuse

Unread postby kinkazma » 08 Feb 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: Select all
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: Select all
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: Select all
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
User avatar
kinkazma
Niveau 8: ER (Espèce Rare: nerd)
Niveau 8: ER (Espèce Rare: nerd)
Level up: 62.9%
 
Posts: 132
Joined: 06 Mar 2018, 23:25
Gender: Male
Calculator(s):
Class: TS

Re: Conjecture de Syracuse

Unread postby Bisam » 15 Feb 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.
User avatar
BisamAdmin
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Level up: 47.8%
 
Posts: 5450
Joined: 11 Mar 2008, 00:00
Location: Lyon
Gender: Male
Calculator(s):


Return to Nspire-Basic

Who is online

Users browsing this forum: No registered users and 0 guests

-
Search
-
Featured topics
Omega, le fork étendant les capacités de ta NumWorks, même en mode examen !
Comparaisons des meilleurs prix pour acheter sa calculatrice !
12
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...

Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety 
-
Stats.
466 utilisateurs:
>451 invités
>9 membres
>6 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)