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
ioscille entre 2 et 4 à l'infini en fonction de la façon dont vous avez encodé les mathématiques pour leisuivant, 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
breakdans 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 :)