Seite 1 von 1

Serpinski Teppich

Verfasst: Samstag 21. Januar 2012, 16:33
von theo.puke
Hallo Forum,
Ich habe mich mit dem Serpinski-Teppich beschäftigt und habe herausbekommen, dass in jeder stufe 8^x Quadrate neu entstehen + die Quadrate, die schon in den früheren Stufen vorhanden waren:

Code: Alles auswählen

import time
def serpinski_quadrate_rekursiv(n,vorigesergebnis=0):
    
    now = time.clock()
    stufenergebnis = pow(8,n)+vorigesergebnis
    if n <= 0:
        print("Dauer: "+str(time.clock()-now))
        return round(stufenergebnis)
        
    stufenergebnis = serpinski_quadrate_rekursiv(n-1,stufenergebnis)
    return stufenergebnis



def serpinski_quadrate_iterativ(n):
  n+=1
  now = time.clock()
  ergebnis = 0
  while n >0:
      n-=1
      ergebnis = pow(8,n)+ergebnis
  print("Dauer: "+ str(time.clock()-now))
  return ergebnis


a = serpinski_quadrate_rekursiv(5)
print (a)
b = serpinski_quadrate_iterativ(5)
print(b)

Das ist die Implementierung.
Aber die Funktion hier kennt keine Verallgemeinerung. Ich benötige eine Summenformel für Potenzen mit immer der gleichen Basis, damit ich eine solche Funktion verallgemeinern kann. Kennt hier jemand eine und weiß sie zu implementieren?

Re: Serpinski Teppich

Verfasst: Samstag 21. Januar 2012, 17:27
von BlackJack
@theo.puke: Du solltest die Zeitmessung aus den Funktionen heraus lassen und das ausserhalb machen. So kann man den Quelltext dafür *einmal* schreiben und in beiden Fällen wieder verwenden. Und sogar noch auf weitere Implementierungen oder ganz andere Funktionen anwenden. Es ist auch nicht so günstig `time.clock()` direkt zu verwenden, denn ob `time.clock()` oder `time.time()` für diese Aufgabe besser geeignet ist, hängt von der Plattform ab, unter der man das laufen lässt. Die Standardbibliothek enthält deshalb das `timeit`-Modul für solche Messungen.

Bei der rekursiven Funktion ist das `round()` unsinnig, denn es wird nur mit ganzen Zahlen gerechnet. Das führt bei grossen Zahlen sogar zu einem Verlust von Rechengenauigkeit, weil Gleitkommazahlen im Gegensatz zum Ganzzahlentyp von Python, in ihrem Wertebereich eingeschränkt sind.

Die iterative Funktion ist unnötig kompliziert. Eine ``while``-Schleife verwendet man wenn man nicht weiss wie oft der Schleifenkörper durchlaufen wird. Wenn man das aber weiss, dann nimmt man eine ``for``-Schleife. Da die Addition kommutativ ist, spielt es auch keine Rolle in welcher Reihenfolge die Terme addiert werden, also muss man nicht von `n` an runter zählen, sondern kann auch bis `n` hoch zählen. Mit `sum()` und einem Generatorausdruck ist das in Python ein Einzeiler:

Code: Alles auswählen

def f3(n):
    return sum(8**i for i in xrange(n + 1))
Als geschlossene Formel sähe das so aus:

Code: Alles auswählen

def f2(n):
    return (8**(n+1) - 1) / 7
Der gute Mann hiess übrigens Sierpińkski.

Re: Serpinski Teppich

Verfasst: Samstag 21. Januar 2012, 18:01
von theo.puke
Ja stimmt, dankeschön. Ich benutze Python nur als "Taschenrechner" für Funktionen, für die ich keine Allgemeinerung gefunden habe. Also bin ich nicht so vertraut mit Generatorenausdrücke etc.. btw. Das ist mein zweiter Beitrag und sage allen Forenmitgliedern ein herzliches "hallo".

Re: Serpinski Teppich

Verfasst: Donnerstag 26. Januar 2012, 16:27
von Dobi
BlackJack hat geschrieben:Der gute Mann hiess übrigens Sierpińkski.
Fast. :mrgreen:

Re: Serpinski Teppich

Verfasst: Donnerstag 26. Januar 2012, 16:46
von theo.puke
@Dobi Nein nach Wikipedia heißt er: Wacław Franciszek Sierpiński , so.

Re: Serpinski Teppich

Verfasst: Donnerstag 26. Januar 2012, 18:48
von Dobi
Das weiß ich. Ich wollte nur lustig sein, weil sich BlackJack beim Korrigieren von dir selber vertippt hat. :wink:

Re: Serpinski Teppich

Verfasst: Donnerstag 26. Januar 2012, 21:57
von BlackJack
:oops: Wobei ich mich jetzt echt frage wo das `k` herkommt, denn den Namen hatte ich kopiert, gerade um zu vermeiden, dass ich mich vertippe. :?

Re: Serpinski Teppich

Verfasst: Donnerstag 26. Januar 2012, 21:59
von /me
BlackJack hat geschrieben::oops: Wobei ich mich jetzt echt frage wo das `k` herkommt, denn den Namen hatte ich kopiert, gerade um zu vermeiden, dass ich mich vertippe. :?
Das Forum ist in PHP geschrieben. Damit ist doch die schuldige Komponente eindeutig identifiziert? :mrgreen:

Re: Serpinski Teppich

Verfasst: Donnerstag 26. Januar 2012, 22:09
von Dobi
Och, ich find BlackJacks Variante eigentlich ganz cool:
Bild
:mrgreen:

Re: Serpinski Teppich

Verfasst: Freitag 27. Januar 2012, 22:17
von theo.puke
Haha. Cooles Bild

Re: Serpinski Teppich

Verfasst: Freitag 27. Januar 2012, 22:31
von Dobi
Kann zwar sein, dass ich den Witz damit kaputt mache, aber weil ich das Gefühl hab', dass er gar nicht angekommen ist: Aus BlackJacks Sierpińkski wird Sir Pink Ski, und der Herr auf dem Bild ist der zum Ritter geschlagene Sir Isaac Newton. ;)

Re: Serpinski Teppich

Verfasst: Freitag 27. Januar 2012, 23:05
von theo.puke
Achso, das is ja noch besser. Ich dachte mir schon, das mit den skiern hab ich kapiert. haha