Inscription / Connexion Nouveau Sujet
Niveau seconde
Partager :

Conjecture de Syracuse python

Posté par
yulia3521
15-04-20 à 14:14

Bonjour à tous,
j'ai beaucoup de mal à écrire cet algorithme…
J'espère vraiment que quelqu'un pourra m'aider.
Voici l'énoncé du programme qui me pose problème:
Partie C
1. En utilisant la fonction écrite en langage Python dans la partie A, écrire un programme qui renvoie la liste contenant tous les temps de vol correspondant aux suites débutant par chacun des nombres de 2 à 100.



Ensuite, j'ai essayé d'écrire le programme de la partie C, mais ça ne me renvoie le temps de vol que pour le n que je donne, et non pas pour les nombres de 2 à n…


def syracusetemps(n):
    liste2=[]
    tps_vol=0
    for i in range(2,n+1,1):
        while n!=1:
            if n%2==0:
                n=n//2
                tps_vol=tps_vol+1
            else:
                n=3*n+1
                tps_vol=tps_vol+1
        liste2=liste2+[tps_vol]
        i=i+1
    return(liste2)


Merci d'avance à ceux qui m'aideront.

Posté par
mathafou Moderateur
re : Conjecture de Syracuse python 15-04-20 à 15:04

Bonjour,

à quoi sert i dans ton algorithme ??
erreur = recopier coller sans adapter la partie A pour faire la B

Posté par
Tintin
re : Conjecture de Syracuse python 15-04-20 à 15:17

Bonjour,
Ta liste comporte toujours le même nombre car le temps de vol n'évolue plus une foie la première boucle avec i=1 terminée.
En effet, quand tu rentres dans ta boucle, tu as i=1, tps_vol=0 et n=ce que tu as mis (exemple 10).
Tu fais tes itérations et en sortie de la boucle pour i=1 tu as: i=1, tps_vol=6 et n=1.
Ensuite tu reviens en haut de ta boucle for puis tu as i=2, tps_vol=6 et n=1. Du coup ta boucle est direct terminée et tu ajoutes un autre 6 dans la liste que tu retournes. Et ainsi de suite jusqu'à la fin complète de ta boucle for.

Au vue des ces remarques, selon toi, comment faire en sorte de trouver le bon résultat ?

Posté par
mathafou Moderateur
re : Conjecture de Syracuse python 15-04-20 à 15:30

deuxième erreur d'ailleurs :

dans une boucle for on n'écrit pas explicitement la progression de la variable (ton i=i+1) !
cela fait partie du fonctionnement même interne du for lui-même :
il exécute la boucle pour chacune des valeurs de l'ensemble de valeurs définies par le range(...)

le i = i+1 ne fait en fait rien du tout
car le for a son propre itérateur de la liste range() et se fiche complètement de ce qu'on fait subir à sa variable i en plus.

comme c'est dit dans la doc :

Citation :
The for-loop makes assignments to the variables(s) in the target list. This overwrites all previous assignments to those variables including those made in the suite of the for-loop
(la boucle for assigne la(es) variable(s) depuis la liste cible. Ceci écrase toutes les affectations précédentes, y compris celles faites dans la suite de la boucle for)

for i in range(10):
      print(i)
      i = 5 # this will not affect the for-loop
                # because it will be overwritten with the next
                # index in the range

(ceci n'affectera pas la boucle car cela sera écrasé par le prochain indice du range)


et même dans aucun langage on n'a à faire progresser explicitement l'indice dans la boucle for, c'est fait automatiquement dans tous les langages

en Python = ça ne fait rien, i progresse "tout seul"
autres langage : ça perturbe le fonctionnement, par exemple i progresserait de 2 en 2 au lieu de 1 en 1, une fois par le i=i+1 explicite, et une deuxième fois par le fonctionnement du for.

ne pas confondre avec une boucle while !!

Posté par
yulia3521
re : Conjecture de Syracuse python 15-04-20 à 18:10

Merci de m'avoir répondu.
En revanche, je n'ai pas compris pour le:

Citation :
En effet, quand tu rentres dans ta boucle, tu as i=1, tps_vol=0 et n=ce que tu as mis (exemple 10).
Tu fais tes itérations et en sortie de la boucle pour i=1 tu as: i=1, tps_vol=6 et n=1.
Ensuite tu reviens en haut de ta boucle for puis tu as i=2, tps_vol=6 et n=1. Du coup ta boucle est direct terminée et tu ajoutes un autre 6 dans la liste que tu retournes. Et ainsi de suite jusqu'à la fin complète de ta boucle for.

Quand je rentre dans ma boucle, ça commence par i=2, non? Et je ne comprend pas : ce que signifie "rajouter un 6".
Du coup, j'ai enlevé les quelques erreurs de mon code, mais je ne sais toujours pas comment faire pour que le temps de vol évolue…


def syracusetemps(n):
    liste2=[]
    tps_vol=0
    for i in range(2,n+1):
        while n!=1:
            if n%2==0:
                n=n//2
                tps_vol=tps_vol+1
            else:
                n=3*n+1
                tps_vol=tps_vol+1
        liste2=liste2+[tps_vol]

    print(liste2)

Posté par
mathafou Moderateur
re : Conjecture de Syracuse python 15-04-20 à 18:17

dans la boucle la variable qui évolue ce n'est pas n, c'est i bien entendu

pour chaque valeur de i on veut calculer le temps de vol de la suite qui commence par i ...

Posté par
Tintin
re : Conjecture de Syracuse python 15-04-20 à 18:30

Oui autant pour moi, quand tu rentres dans la boucle i=2.
Pour que ce soit plus clair je vais reprendre. Du coup je te propose de prendre n=10 et de suivre ton algorithme .

Tu crées une liste vide
TPS de vol = 0
*on rentre dans la boucle for*
i=2
*on rentre dan la boucle while*
n est pair, du coup n prend la valeur 5
TPS de vol = 1
*on reste dans la boucle while jusque ce que n=1*
n est impair, du coup prend la valeur 16
Tps=2

N est pair donc n=8
TPS=3

N est pair donc n=4
Tps = 4

N est pair donc n=2
Tps = 5

N est pair donc n=1
Tps=6

*on sort du whine car n=1*
On ajoute le temps de vol à la liste: Liste2=[ 6 ]

*on recommence en incrementant i*
i=3
*boucle while*
n=1
*on ressort du while, rien n'a bougé*
On ajoute la valeur de temps de vol dans la liste. Du coup Liste2=[2 , 2]

Et ainsi de suite jusque i=11


Du coup dans ton algorithme,  il manque le moment où tu réinitialises ton temps de vol et ton n...

Posté par
yulia3521
re : Conjecture de Syracuse python 15-04-20 à 18:46

Ok, j'ai compris, merci beaucoup pour cette explication!

Posté par
mathafou Moderateur
re : Conjecture de Syracuse python 15-04-20 à 18:53

"il manque le moment où tu réinitialises ton temps de vol et ton n..."
non.

j'insiste
n est une donnée d'entrée , pas une variable prévue pour varier pendant l'exécution
la variable qui varie c'est i et rien que i
on n'a pas à modifier n en quoi que ce soit dans l'algorithme.

Posté par
Tintin
re : Conjecture de Syracuse python 15-04-20 à 18:53

Au passage, plutôt que de modifier ton n (qui sert pour la fin de ta boucle for), je te recommande d'introduire une nouvelle variable. Ou alors tu crées une variable spéciale qui ne servira que pour le range. Avoir 1 variable pour 2 choses c'est jamais trop bon...

Posté par
mathafou Moderateur
re : Conjecture de Syracuse python 15-04-20 à 18:54

non
la variable est déja créée c'est i

Posté par
Tintin
re : Conjecture de Syracuse python 15-04-20 à 19:00

Meme si l'informatique gère plutôt bien les notions de variables locales et globales, je pense que modifier le i au sein de la boucle n'est pas l'idéal...

D'où l'introduction d'une nouvelle variable qui prendra comme valeur de départ celle de i puis subira toutes les transformations décrites par le vol de syracuse jusqu'à atteindre 1.

Posté par
flight
re : Conjecture de Syracuse python 15-04-20 à 19:15

salut

sur un tableur , par vba ;

Citation :

Sub temps_de_vol()
Dim p As Integer
w=""
For i = 2 To 200
p = i
j = 0
Do
j = j + 1
If p Mod 2 = 0 Then
  p = p / 2
  
  Else
  p = 3 * p + 1
  
End If
Loop Until p = 1
w = w & "  " & j   ' resultat stocké dans une variable
Cells(i - 1, 1) = j
Next
MsgBox w
End Sub


retourne :
1
7
2
5
8
16
3
19
6
14
9
9
** .... liste tronquée  car flood de la discussion par un messag inutilement long ***

à comparer avec tes resultats en python

Posté par
flight
re : Conjecture de Syracuse python 15-04-20 à 19:19

....la variable j renvois les temps de vol pour chaque valeur de i

Posté par
mathafou Moderateur
re : Conjecture de Syracuse python 15-04-20 à 19:42

Citation :
D'où l'introduction d'une nouvelle variable qui prendra comme valeur de départ celle de i
on est bien d'accord que il s'agit de \Large \red i, pas de n
ce qui semble avoir totalement échappé à yulia3521

si ça te fait plaisir, prendre une nouvelle variable ni i, ni n, ni tps_vol, OK
au moins ce sera portable quel que soit le langage

de toute façon :
mais le mieux est de toute façon de respecter à la lettre l'énoncé !!!
En utilisant la fonction écrite en langage Python dans la partie A,

utiliser ça veut dire faire un appel à cette fonction de la partie A
pas refaire tout à partir de zéro par "copier - coller - se tromper de variable en oubliant de modifier" !!

de l'importance absolue de donner des énoncés complets,
surtout quand il y a une phrase "en utilisant la partie A" et qu'on ne donne pas cette partie A, donc il est IMPOSSIBLE de faire l'exo avec cet énoncé tronqué comme ça : il est impossible d'utiliser quelque chose qu'on n'a pas !!

certes on peut faire un autre exo à la place
avec tout nu sans aucune référence à une quelconque partie A qui n'existe pas :
écrire un programme qui renvoie la liste contenant tous les temps de vol correspondant aux suites débutant par chacun des nombres de 2 à 100.

(en plus c'est un programme, pas une fonction, donner comme réponse une fonction est ne pas répondre correctement à la question)

donc ça serait directement sans aucun def

for n in range (2, 100):
      etc



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Inscription gratuite

Fiches en rapport

parmi 1489 fiches de maths

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !