1
votes

Problème très débutant en Python While Loop

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

Sortie

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


8 commentaires

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 le i 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 :)


3 Réponses :


4
votes

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.


0 commentaires

1
votes

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


1 commentaires

0
votes

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 .


0 commentaires