Seite 1 von 2

Pascalsches Dreieck mit python (dringend!)

Verfasst: Dienstag 5. Januar 2010, 19:42
von gamemaster2422
Ich muss für die schule die ersten 15 zeilen des pascalschen dreiecks in python so programmieren, dass es in python shell ausgegeben wird, und zwar 1. als liste ( [ [1][1,1][1,2,1]...]) und 2. in der richtigen form (http://exbook.de/wp-content/Pascal_triangle.png), also in form eines dreiecks.
kann mir da jemand helfen, wenn möglich jeden schritt erläutert? ich kriege es einfach nicht gebacken!
allerdings muss ich das ganze donnerstag abgeben.
schonmal danke im vorraus

edit: ich hatte keine ahnung in welches forum diese frage gehört, wenn sie hier falsch ist, tuts mir leid^^

Re: Pascalsches Dreieck mit python (dringend!)

Verfasst: Dienstag 5. Januar 2010, 19:48
von numerix
gamemaster2422 hat geschrieben:ich hatte keine ahnung in welches forum diese frage gehört, wenn sie hier falsch ist, tuts mir leid^^
Diese Frage ist in jedem Forum falsch, weil - vermutlich (aber sicher kann man da nie sein) - keiner DEINE Hausaufgaben machen will, auch wenn die gestellte Aufgabe von vielen hier im Forum in wenigen Minuten gelöst werden könnte.

Dein Weg sieht so aus: Entwickle den Code so weit wie du kommst und beschreib dann, was noch nicht funktioniert und was du gerne hättest.

Verfasst: Dienstag 5. Januar 2010, 19:58
von gamemaster2422
ich weiß nicht, wie man vorgeben soll, welche zahlen addiert weden.
bsp:
1
1 1
1 2 1
1 3 3 1
zuerst werden 1 und 1 addiert, dann 1 und 2, dann 1 und 3, dann 3 und 3 usw.

Verfasst: Dienstag 5. Januar 2010, 20:10
von lunar

Verfasst: Dienstag 5. Januar 2010, 20:13
von Hyperion
gamemaster2422 hat geschrieben:ich weiß nicht, wie man vorgeben soll, welche zahlen addiert weden.
Dann guck doch hier:
http://de.wikipedia.org/wiki/Pascalsches_Dreieck

Auch ohne komplexe Formel sollte einem das Prinzip klar werden... (und Dein Ergebnis steht da ja auch schon!)

Mach Dir folgendes klar:
Du musst Dir immer die letzte Zeile merken, sowie die sich Schritt weise aufbauende aktuelle. Diese wird dann im nächsten Durchgang zur "alten", aus der Du dir die beiden Zahlen entsprechend dem Schema holst, die Du addieren musst. Zeilen kann man sich leicht in einer Liste merken.
Zudem musst Du wohl eine Schleife 14 mal durchlaufen (sofern die erste Zeile gegeben ist; evtl. macht es sogar Sinn erst mit der 3. Zeile in der Schleife zu beginnen).

Das sind ja quasi alle Zutaten, die man braucht, um dieses Problem zu lösen.

Verfasst: Dienstag 5. Januar 2010, 20:21
von hendrikS
Habe ich zufälligerweise parat.

Code: Alles auswählen

l=[1];x=15
while x:
 print" ".join(map(str,l));x-=1
 l=map(sum,zip([0]+l,l+[0]))

Verfasst: Dienstag 5. Januar 2010, 20:26
von numerix
@hendrikS: Da stimmt aber das gewünschte Ausgabeformat nicht. :wink:
Sollte doch so aussehen:

Code: Alles auswählen

>>> from pascaldreieck import PascalDreieck
>>> dreieck = PascalDreieck(15)
>>> print dreieck
                                           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
                  1   10   45  120  210  252  210  120   45   10    1
                1   11   55  165  330  462  462  330  165   55   11    1
             1   12   66  220  495  792  924  792  495  220   66   12    1
           1   13   78  286  715 1287 1716 1716 1287  715  286   78   13    1
        1   14   91  364 1001 2002 3003 3432 3003 2002 1001  364   91   14    1
      1   15  105  455 1365 3003 5005 6435 6435 5005 3003 1365  455  105   15    1

Verfasst: Dienstag 5. Januar 2010, 20:30
von Hyperion
numerix hat geschrieben:

Code: Alles auswählen

>>> from pascaldreieck import PascalDreieck
Wo finde ich diese Lib? :D
SCNR ;-)

Verfasst: Dienstag 5. Januar 2010, 20:32
von ...

Code: Alles auswählen

print 'Wieviele Zeilen?'
lines = raw_input()
lines = int(lines)
lines = range(lines)


pascal_list = []

for line in lines:
    pascal_list.append([1])
    if line != 0:
        for element in range(len(pascal_list[line-1])):
            pascal_list[line].append(sum(pascal_list[line-1][element:element+2]))
            
for print_pascal in pascal_list:
    print print_pascal
Unformatiert, bestimmt grauenhafter Programmierstil usw... aber ich glaub es sollte funktionieren :S

Verfasst: Dienstag 5. Januar 2010, 20:33
von DasIch
Hyperion hat geschrieben:
numerix hat geschrieben:

Code: Alles auswählen

>>> from pascaldreieck import PascalDreieck
Wo finde ich diese Lib? :D
SCNR ;-)
/usr/lib/python2.6/site-packages/pascaldreieck.py natürlich.

Verfasst: Dienstag 5. Januar 2010, 20:34
von jbs
Gibts das auch als .egg?

Verfasst: Dienstag 5. Januar 2010, 20:34
von hendrikS
Ja, Formattierung fehlt noch.
Sollte aber auch kein Problem sein. Ich denke rjust(5) auf alle Zahlen und dann noch Leerzeichen entsprechend der Zeile vorschieben.

Verfasst: Dienstag 5. Januar 2010, 20:40
von gamemaster2422
also bei mir klappts nicht ganz...das von hendrikS und numerix zusammengebastelte klappt nicht, da heißt es das from aus
from pascaldreieck import PascalDreieck
sei falsch.
die version von ... funktioniert, bis auf den punkt, dass es nicht vollständig formatiert ist und ich nicht genau weiß wie das jetzt funktioniert^^

Verfasst: Dienstag 5. Januar 2010, 20:45
von Hyperion
hendrikS hat geschrieben:Ja, Formattierung fehlt noch.
Sollte aber auch kein Problem sein. Ich denke rjust(5) auf alle Zahlen und dann noch Leerzeichen entsprechend der Zeile vorschieben.
Müßte das nicht auch mit string.center() gehen?

Verfasst: Dienstag 5. Januar 2010, 20:45
von numerix
hendrikS hat geschrieben:Ja, Formattierung fehlt noch.
Sollte aber auch kein Problem sein. Ich denke rjust(5) auf alle Zahlen und dann noch Leerzeichen entsprechend der Zeile vorschieben.
Dann sieht das aber bei kleinen Dreiecken aus wie Hund. Lieber so:

Code: Alles auswählen

>>> from pascaldreieck import PascalDreieck
>>> dreieck = PascalDreieck(3)
>>> print dreieck
    1
   1 1
  1 2 1
 1 3 3 1
>>> dreieck = PascalDreieck(10)
>>> print dreieck
                        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
    1  10  45 120 210 252 210 120  45  10   1
>>> dreieck = PascalDreieck(100) # das erspare ich euch ...

Verfasst: Dienstag 5. Januar 2010, 20:47
von gamemaster2422
mein interpterer sagt mir dabei:
No module named pascaldreieck

Verfasst: Dienstag 5. Januar 2010, 20:47
von numerix
gamemaster2422 hat geschrieben:da heißt es das from aus
from pascaldreieck import PascalDreieck
sei falsch.
Hast du den Post von DasIch nicht gelesen? Wahrscheinlich fehlt das Modul pascaldreieck.py in deinem site-packages-Ordner ... :D

Verfasst: Dienstag 5. Januar 2010, 20:49
von gamemaster2422
und wo kriege ich das her?

Verfasst: Dienstag 5. Januar 2010, 20:51
von Hyperion
numerix hat geschrieben:
gamemaster2422 hat geschrieben:da heißt es das from aus
from pascaldreieck import PascalDreieck
sei falsch.
Hast du den Post von DasIch nicht gelesen? Wahrscheinlich fehlt das Modul pascaldreieck.py in deinem site-packages-Ordner ... :D
Nun hört doch auf den OP zu verarschen - er hat den Witz halt nicht gecheckt ;-)

Verfasst: Dienstag 5. Januar 2010, 20:53
von ...

Code: Alles auswählen

# -*- coding: utf-8 -*-
"""
Spyder Editor

This temporary script file is located here:
/home/michael/.spyder/.temp.py
"""


print 'Wieviele Zeilen?'
lines = raw_input()
lines = int(lines)
lines = range(lines)


pascal_list = []

for line in lines:
    pascal_list.append([1])
    if line != 0:
        for element in range(len(pascal_list[line-1])):
            pascal_list[line].append(sum(pascal_list[line-1][element:element+2]))

rev_lines = lines
rev_lines.reverse()
for n in range(len(rev_lines)):
    pascal_print = ''
    for m in pascal_list[n]:
        if pascal_print == '':
            pascal_print = str(m)
        else:
            pascal_print = pascal_print + ' '*(6-len(str(m))) + str(m)
    print '   '*(rev_lines[n]) + pascal_print

Hier noch mit Kopf durch die Wand...
Jetzt gibt es die Ausgabe auch als Dreieck :)

Code: Alles auswählen

                                 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
   1    10    45   120   210   252   210   120    45    10     1
1    11    55   165   330   462   462   330   165    55    11     1
Die 6-len(str(m)) muss man halt anpassen...
Wenn die Zahlen unten immer größer Werden, und irgendwann mehr als 6 Stellen haben, tuts weh.