IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Programme sur la conjecture de Syracuse


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Par défaut Programme sur la conjecture de Syracuse
    Bonjour tout le monde,
    J'ai besoin d'un petit coup de main sur la programmation de la conjecture de Syracuse.
    Le problème est simple, on se donne un entier plus grand que 1:
    - S'il est pair, on le divise par deux
    - S'il est impair, on le multiplie par 3 et on lui ajoute 1
    On "conjecture" que l'on finit toujours par trouver la valeur 1

    Voici mon programme:
    Je dois donner les entiers de mon entier définit jusqu'à ce qu'il atteigne la valeur1, sous forme d'une liste.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def syrac(n):
     
        listsyrac=list()
        if (type(n) != type(1) or n<1):
            return None 
     
        while n!=1:
            if n%2 == 0:
                n=n/2
            else:
              n=(n*3)+1
            print(n)
    C'est dans l'afichage de la liste que je bloque .. Je ne sais pas comment ajouter les valeurs de n au fur et à mesure avec uen boucle While. Avec une boucle For j'utilise append mais la je ne sais pas comment faire l'analogie ..
    Si quelqu'un pouvait m'éclairer un peu ? Merci.

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 196
    Billets dans le blog
    47
    Par défaut
    Bonjour,

    Citation Envoyé par VincentBr Voir le message
    Je ne sais pas comment ajouter les valeurs de n au fur et à mesure avec uen boucle While. Avec une boucle For j'utilise append mais la je ne sais pas comment faire l'analogie
    Et qu'est-ce qui t'empêche de faire un append dans un while ?

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Par défaut Suite du programme
    Merci f-leb, j'avais finalement réussi à trouver la solution avec append.

    Voici la suite de mon programme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    def syrac(n):
        I=0   
        listsyrac=list()
        if (type(n) != type(1) or n<1):
            return None 
        while n!=1:
            if n%2 == 0:
                n=n/2
            else:
              n=(n*3)+1
            I=I+1
            listsyrac.append(n)
     
     
        print("'La trajectoire de l'entier', n , 'est:' ")
        print(listsyrac)
        print(I)
     
     
    def caractvol(n):
        syrac(n)
        #Temps de vol#
        print("Le temps de vol de cet entier est: ")
        print(I)
     
        #Altitude Maximale#
        def altitudemaximale(listsyrac):
        max=listsyrac[0]
        for j in range (len(listsyrac)):
            if listsyrac[j]>max:
                max=listsyrac[j]
    Maintenant, je suis face à un autre problème, je dois réutiliser ma fonction 'syrac(n)' (soit les résultats de cette fonction) pour écrire une autre fonction qui me donnera:
    - Le temps de vol = le nombre d'étapes à franchir avant d'arriver pour la première fois à 1
    - L'altitude maximale = le nombre le plus élévé atteint par la fonction syrac

    Mon problème vient du fait que je ne sais pas comment l'ordinateur gère les résultats des variables de ma fonction syrac(n); soit 'listsyrac' et 'I'. 'I' me sert de compteur pour le temps de vol, pas de problème lorsque je fais tourner ma fonction syrac(n) toute seule mais lorsque j'utilise ma fonction syrac(n) dans ma deuxième fonction caractvol(n), j'obtiens l'erreur "I is not defined".
    Comment je peux résoudre ce problème ?
    De la même facon, Python me signale que 'max' n'est pas définit ..
    Une solution s'il vous plaît ?

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 196
    Billets dans le blog
    47
    Par défaut
    Tu t'en sortiras mieux si ta fonction retourne la liste :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def syrac(n):
        ....
        ....
        return listsyrac


    dans une console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> print (syrac(15))
    [15, 46, ... ]

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Par défaut
    Il y a quelque chose que je ne comprends .. que j'écrive syrac(15) ou print(syrac(15)). Ma liste est toujours affichée.
    Mais la valeur de I n'est jamais retourné ..

    Nom : Capture d’écran 2014-10-26 à 15.10.24.png
Affichages : 30336
Taille : 49,5 Ko

    Comment faire pour afficher la valeur de I ?
    Ma boucle ne lit pas I ?

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Par défaut
    Je viens de repérer le problème ..

    Nom : Capture d’écran 2014-10-26 à 15.21.09.png
Affichages : 32666
Taille : 67,4 Ko

    Une fonction ne peut retourner qu'une seule variable ?
    Il affecte à I, la valeur 17 mais après il me dit qu'elle n'est pas défini .. ? Je suis perdu ..

  7. #7
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 196
    Billets dans le blog
    47
    Par défaut
    En Python tu peux retourner plusieurs valeurs, du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return list_syrac, temps_vol, temps_vol_altitude, altitude_maxi
    Tu peux retourner aussi un dictionnaire (voir FAQ, cours...) :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    def syrac(n):
    ...
        dico={}
        dico['liste']=list_syrac
        dico['temps vol']=temps_vol
        dico['temps vol altitude']= temps_vol_altitude
        dico['altitude maxi']=altitude_maxi
        return(dico)
     
     
    n=125    
    print ("suite de syracuse n=", n)    
    for cle, valeur in syrac(n).items():
        print (cle,":",valeur)

    Remarque : le premier élément de ta liste est n, initialement listsyrac=[n].

    Sinon, poste ton code par copier-coller avec les bonnes balises plutôt que des copies d'écran, ce sera plus facile pour ceux qui veulent récupérer ton code pour le tester.

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Une fonction doit faire une chose simple d'autant que les informations que vous essayez de calculer dans la boucle sont faciles a obtenir à partir de la liste retournée.
    Ecrivons:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> def syracuse(n):
    ...     rs = []
    ...     while n != 1:
    ...        if n % 2:
    ...           n = n*3+1
    ...        else:
    ...           n = n // 2
    ...        rs.append(n)
    ...     return rs
    ...
    Avec çà, on obtient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> L = syracuse(3)
    >>> L
    [10, 5, 16, 8, 4, 2, 1]
    >>>
    Pour savoir le nombre d'éléments de la liste:
    Quand au maximum:
    Bien sûr, vous pouvez ajouter des instructions dans la boucle "while" pour calculer tout çà au fur et a mesure, mais çà complique la fonction et çà vous fait passer à côté de fonctions simples telles que "len" et "max" qui sont là pour vous éviter cette galère.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Réponses: 7
    Dernier message: 24/01/2005, 11h36
  2. [Eclipse] Programmer sur un fond noir
    Par raj dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 27/12/2004, 10h15
  3. [Reseau] Execution de programmes sur un autre PC
    Par el3gans dans le forum Général Java
    Réponses: 5
    Dernier message: 18/11/2004, 11h20
  4. Methode de programmation sur des gros projets
    Par dynobremo dans le forum EDI
    Réponses: 10
    Dernier message: 08/06/2004, 02h59
  5. Déclenchement Programme sur Virtual Key
    Par Tom-G dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 09/05/2003, 12h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo