Pourquoi cette boucle While ne s'arrête pas ou ne s'arrête pas
J'ai ajouté une capture d'écran de sortie
term = 1 i = 13 while i > 1: print i > 1 if i%2 == 0: i = i / 2 term += 1 if i%2 != 0: i = i * 3 + 1 term += 1
J'ai aussi essayé cette méthode
term = 0 i = 13 while True: print i > 1 print "i = ",i if i == 1: term += 1 break if i%2 == 0: i = i / 2 term += 1 if i%2 != 0: i = i * 3 + 1 term += 1
3 Réponses :
Utilisez elif
pour rendre les cas mutuellement exclusifs. Vous ne voulez pas que plusieurs instructions if
s'exécutent dans la même itération de boucle.
if i%2 == 0: i = i / 2 # 4 --> 2 term += 1
Ou faites-la simplement else
depuis la deuxième condition est redondant.
if i%2 == 0: i = i / 2 # 2 --> 1 term += 1 if i%2 != 0: i = i * 3 + 1 # 1 --> 4 term += 1
La raison pour laquelle il oscille entre 2
et 4
comme écrit est parce que 2
provoque l'exécution des deux instructions if
. 2
est même si le premier s'exécute et divise par deux i
, ce qui en fait 1
. Maintenant c'est bizarre et le second se déclenche, transformant 1
en 4
.
if i%2 == 0: i = i / 2 term += 1 else: i = i * 3 + 1 term += 1
La prochaine itération 4
devient 2
.
if i%2 == 0: i = i / 2 term += 1 elif i%2 != 0: i = i * 3 + 1 term += 1
Ces deux itérations se répètent encore et encore dans un cycle sans fin.
Disons que votre i
est 2. Il est divisible par 2, donc si i% 2 == 0
se déclenche, et i
devient 1. Et le code continue de s'exécuter, donc maintenant nous sommes à la ligne if i% 2! = 0
, et cette condition est également vraie , car vous venez de modifier i
et c'est maintenant 1. Donc i
devient 4.
Votre deuxième tentative modifiée, qui empêche la deuxième condition d'être vérifiée si la première réussit, est ci-dessous: p>
term = 1 i = 13 while i > 1: print(i > 1) if i % 2 == 0: i = i / 2 term += 1 continue if i % 2 != 0: i = i * 3 + 1 term += 1
Notez également que vous n'avez pas besoin de vérifier la deuxième condition, car elle est certainement vraie si la première ne l'est pas, donc elif ... code> peut être remplacé uniquement par
else:
Vous pouvez également utiliser le mot-clé continue
pour empêcher le reste de la boucle de s'exécuter si la première condition est vrai:
term = 1 i = 13 while i > 1: print(i > 1) if i % 2 == 0: i = i / 2 term += 1 elif i % 2 != 0: i = i * 3 + 1 term += 1
Votre première tentative a exactement le même problème; le réparer je laisse comme exercice pour le lecteur :)
P.S. n'apprendre pas Python 2
Ce n'est plus. python.org/doc/sunset-python-2
Le problème est:
if i%2 == 0: i = i / 2 term += 1 if i%2 != 0: i = i * 3 + 1 term += 1
Le problème est que, si i% 2 == 0
est true
, il restera true jusqu'à i = 1
. Une fois que i = 1
, i% 2! = 0
s'exécute et rend i = 4
.
Ce n'est pas une rupture ou un arrêt parce que
i
oscille entre 2 et 4 à l'infini en fonction de la façon dont vous avez encodé les mathématiques pour lei
suivant, de sorte que la condition d'arrêt est inaccessible. Qu'est-ce que c'est censé faire? Est-ce censé exécuter Collatz ?maman, regarde le premier que j'utilise break in first if block
@mama Que voulez-vous dire? Il y a une instruction
break
dans la première, et la seconde a une condition de boucle.ggorlen, il suppose de s'arrêter quand i vaut 1
débarrassé, il devient 1, puis il passe toujours par la boucle
@rid Ce programme teste la conjecture de Collatz et, si elle est correctement codée, atteindra éventuellement 1.
Vous semblez utiliser Python 2 (basé sur l'utilisation d'une instruction
print
). En tant que débutant, vous devriez plutôt apprendre Python 3.vous pouvez jouer avec et le déplacer pour apprendre comment cela fonctionne :)