Serpinski Teppich

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
theo.puke
User
Beiträge: 17
Registriert: Samstag 21. Januar 2012, 16:17

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?
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.
theo.puke
User
Beiträge: 17
Registriert: Samstag 21. Januar 2012, 16:17

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".
Benutzeravatar
Dobi
User
Beiträge: 31
Registriert: Mittwoch 28. September 2011, 17:04

BlackJack hat geschrieben:Der gute Mann hiess übrigens Sierpińkski.
Fast. :mrgreen:
theo.puke
User
Beiträge: 17
Registriert: Samstag 21. Januar 2012, 16:17

@Dobi Nein nach Wikipedia heißt er: Wacław Franciszek Sierpiński , so.
Benutzeravatar
Dobi
User
Beiträge: 31
Registriert: Mittwoch 28. September 2011, 17:04

Das weiß ich. Ich wollte nur lustig sein, weil sich BlackJack beim Korrigieren von dir selber vertippt hat. :wink:
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. :?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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:
Benutzeravatar
Dobi
User
Beiträge: 31
Registriert: Mittwoch 28. September 2011, 17:04

Och, ich find BlackJacks Variante eigentlich ganz cool:
Bild
:mrgreen:
theo.puke
User
Beiträge: 17
Registriert: Samstag 21. Januar 2012, 16:17

Haha. Cooles Bild
Benutzeravatar
Dobi
User
Beiträge: 31
Registriert: Mittwoch 28. September 2011, 17:04

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. ;)
theo.puke
User
Beiträge: 17
Registriert: Samstag 21. Januar 2012, 16:17

Achso, das is ja noch besser. Ich dachte mir schon, das mit den skiern hab ich kapiert. haha
Antworten