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 :

triangle pascal en python


Sujet :

Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 34
    Par défaut triangle pascal en python
    bonjour,
    je n'arrive pas à programmer et afficher un triangle de pascal en python, pouvez-vous m'aider s'il vous plaît ?
    merci !

  2. #2
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Bonjour,

    quel est exactement ton problème, où bloques-tu?

    Pour apprendre facilement Python regarde ces tutoriels et cours pour apprendre Python : http://python.developpez.com/cours/
    Le meilleur livre Python : Apprendre à programmer avec Python 3 par Gérard Swinnen http://python.developpez.com/cours/apprendre-python3/

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 34
    Par défaut
    bonjour Pacificator,
    en fait, j'essaie de faire une liste de liste que j'écris s[i][j] pour pouvoir représenter à la fois les lignes et les colonnes mais python bloque dès mon initialisation s[i][1]=1, avec le message d'erreur suivant :
    " 'int' object does not support item assignment" !
    que cela veut-il dire ??

  4. #4
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    l'initialisation de ta liste de liste ne doit pas être correcte.
    Comment procèdes-tu?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 34
    Par défaut
    alors j'ai déjà fait : s=[0]*n ou encore s=[][]
    je sens que ça ne vas pas mais je ne sais pas comment...

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 34
    Par défaut
    je n'y arrive toujours pas, une idée ?

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Si tu tiens à pré-allouer ta liste de liste, de façon à pouvoir accéder à l'élément s[3][2] par exemple, et lui attribuer une valeur par après, tu peux le faire ainsi (sous forme de triangle):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s = [ [0]*i for i in xrange(20)]
    20 étant le nombre de lignes du triangle que tu veux générer.

    Mais c'est une façon très "C" de le faire; si tu calcules les éléments au fur et à mesure, tu peux directement construire ton tableau avec les bonnes valeurs dedans sans devoir les allouer au préalable.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 34
    Par défaut
    merci dividee ! lorsque je cherche à allouer mon tableau ça marche mais comme c'est un triangle de pascal, j'essaie de le construire au fur et à mesure avec une loi de récurrence, sauf que là ça ne va plus, le message d'erreur me dit que je n'ai pas défini s : comment définir s sans allouer ?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 34
    Par défaut
    s'il vous plaît ?
    j'ai aussi une autre question sur laquelle je rame, comment à la fin représenter mon triangle exactement comme celui de pascal, ie sans crochets, et avec ses lignes superposées ??
    merci !

  10. #10
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Il est important d'avoir une idée précise de la structure de donnée capable de contenir le triangle de pascal.

    Je verrais bien cela comme cela:

    T[[1], [1,1], [1,2,1], [1,3,3,1], etc...]

    Dans ce cas, il faut construire la liste de liste au fur et à mesure des besoins, un peu comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    T = [[1],[1,1]]
    print T[0]
    print T[1]
     
    for i in range(2,10):
        T.append([1]) # initialisation pour T[i][0]=1
        for j in range(1, i):
            T[i].append(T[i-1][j-1] + T[i-1][j])
        T[i].append(1)  # initialisation pour T[i][i]=1
        print T[i]
    Ce qui affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    [1]
    [1, 1]
    [1, 2, 1]
    [1, 3, 3, 1]
    [1, 4, 6, 4, 1]
    [1, 5, 10, 10, 5, 1]
    [1, 6, 15, 20, 15, 6, 1]
    [1, 7, 21, 35, 35, 21, 7, 1]
    [1, 8, 28, 56, 70, 56, 28, 8, 1]
    [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
    Si en plus tu veux supprimer les crochets et les virgules, il faut faire une boucle pour chaque ligne et utiliser les fonctions d'affichage et/ou transformer en chaine de caractères.

    Tyrtamos

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 34
    Par défaut
    merci Tyrtamos !! par contre, il faut maintenant que je vois comment enlever les crochets et les virgules...

  12. #12
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Dis donc, tu as sacrément besoin d'un bon manuel de Python...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for i in range(0,10):
        ch = ""
        for j in range(0,i+1):
            ch += "%5d" % T[i][j]
        print ch
    Ce qui affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        1
        1    1
        1    2    1
        1    3    3    1
        1    4    6    4    1
        1    5   10   10    5    1
        1    6   15   20   15    6    1
        1    7   21   35   35   21    7    1
        1    8   28   56   70   56   28    8    1
        1    9   36   84  126  126   84   36    9    1
    Tyrtamos

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 34
    Par défaut
    merci encore Tyrtamos ! j'avais presque réussi mais en utilisant la méthode join()...j'ai de bon cours de python mais c'est quand je trouve pas ma réponse que je viens ici ;-)
    Par contre, j'ai rencontré un problème de taille dans la nuit : en calculant avec la même méthode des triangles d'entiers long T[i][j] de très grandes tailles puis en prenant par exemple leur T[i][j]%3 (reste de la division euclidienne par 3) j'obtiens un nouveau triangle, ça marche très bien au début, mais, ô surprise ! à partir d'une certaine ligne i (en gros, la taille de mes long "augmente" avec l'indice ligne comme le triangle de pascal mais sont plus gros) les résultats sont faux !!! Je suis très surpris et même déçu par ce résultat car je croyais que python n'avait pas de problème de calculs avec les grands entiers long, mais là !!!
    Pouvons-nous en discuter ensemble ?

    nb : la loi de récurrence de mon triangle est :
    T[i+1][j+1]=long((1/2)*(i+2j)*(i+2j-1)T[i][j]) + long((j+1)*T[i][j+1])

  14. #14
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Citation Envoyé par info! Voir le message
    nb : la loi de récurrence de mon triangle est :
    T[i+1][j+1]=long((1/2)*(i+2j)*(i+2j-1)T[i][j]) + long((j+1)*T[i][j+1])
    Euh... Est-ce la formule exacte que tu utilises en Python ? (1/2) renvoie 0 en Python 2.5 (et 0.5 en Python 3.0). Dans le premier cas, ce n'est certainement pas juste; et dans le second, le fait de passer par un réel (flottant) limite la précision; il faudrait plutôt écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T[i+1][j+1]=(i+2j)*(i+2j-1)//2*T[i][j] + (j+1)*T[i][j+1]

  15. #15
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par info! Voir le message
    Pouvons-nous en discuter ensemble ?
    Bien sûr!

    Regarde déjà ce que te dit dividee. C'est une particularité de Python qui va disparaitre avec la 3.0. En ce qui me concerne, j'utilise la version 2.5, mais j'anticipe en mettant la ligne suivante juste après le shebang et l'encodage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    from __future__ import division
    Avec cette ligne, 1/2 fait bien 0.5 et pas 0.

    Pour le reste, j'ai déjà calculé avec des entiers très très long (10000 chiffres), et je n'ai pas encore trouvé d'erreur.

    Donne toutes les formules que tu utilises.

    Tyrtamos

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 34
    Par défaut
    merci chers Dividee et Tyrtamos, ça marche !!
    effectivement c'était bien un problème de signe / flottant au lieu de //,
    je vais essayer d'installer ta commande Tyrtamos...

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 34
    Par défaut
    resalut,
    j'ai un problème en voulant installer ta ligne Tyrtamos, je fais en première ligne :
    !# usr/bin/env python
    from_future_import division

    Mais on m'affiche une erreur de syntaxe pour la deuxième ligne ! j'ai un sérieux doute sur mon encodage...

  18. #18
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Tu aurais dû faire du copier-coller: il y a un espace après from et avant import.

    Tyrtamos

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 34
    Par défaut
    très bien, c'était ça (plus une erreur dans mon path) merci Tyrtamos j'ai appris plein de choses !
    une dernière question peut-être : je suis entrain d'afficher des triangles numériques en binaire (0 ou 1) avec de plus en plus de lignes, mais à partir de 80 lignes environ, les lignes trop longues sont affichées en plusieurs sous-lignes, or j'ai besoin de voir mon triangle en entier, n'y a t-il pas un moyen donc d'élargir l'affichage du triangle, comme si on le "voyait de plus loin" en totalité, ou de le mettre sous pdf ou que sais-je...?
    merci !

  20. #20
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Je n'ai pas trop d'idée sur la question. Si je devais le faire rapidement, je crois que je sauverais le résultat dans un fichier texte que je reprendrais ensuite sous word ou openoffice, afin de bénéficier des changements de taille de police.

    Tyrtamos

Discussions similaires

  1. Réponses: 101
    Dernier message: 07/03/2010, 02h55
  2. triangle de pascal
    Par chouuc dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 20/01/2009, 01h36
  3. Réponses: 2
    Dernier message: 27/03/2007, 23h12
  4. Triangle de Pascal
    Par WhiteTigerZ dans le forum Pascal
    Réponses: 5
    Dernier message: 09/03/2007, 19h47
  5. Triangle de Pascal
    Par yushkoya dans le forum VBScript
    Réponses: 6
    Dernier message: 11/07/2006, 14h18

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