====== Rekursion ======
to be written
* Fakultät rekursiv (schon bei Funktionen)
* divide et impera / divide and conquer / teile und herrsche
[[https://de.wikipedia.org/wiki/Rekursion#Rekursive_Grafiken|Wikipedia Rekursion]]
Sierpinski rekursiv ist schon gut, eventuell turtle Grafik, Bilder von Wikipedia?
Hanoi?
[[https://de.wikipedia.org/wiki/Cantor-Menge|Cantor-Menge]] im Textmodus:
def cantor(x):
if x == 0:
return "*"
else:
s = cantor(x - 1)
return s + (3**(x-1)) * "-" + s
for i in range(5):
print(cantor(i))
from gpanel import *
def zeichne(x, y, l, xr, yr, rekursionstiefe):
if rekursionstiefe == 0:
line(x, y, x + l * xr, y + l * yr)
else:
xl = -yr
yl = xr
zeichne(x, y, l/3, xr, yr, rekursionstiefe - 1)
zeichne(x + 2*l/3 * xr, y + 2*l/3 * yr, l/3, xr, yr, rekursionstiefe - 1)
zeichne(x + l/3 * xr, y + l/3 * yr, l/3, xl, yl, rekursionstiefe - 1)
zeichne(x + l/3 * (xr + xl), y + l/3 * (yr + yl), l/3, xr, yr, rekursionstiefe - 1)
zeichne(x + l/3 * (2 * xr + xl), y + l/3 * (2 * yr + yl), l/3, -xl, -yl, rekursionstiefe - 1)
makeGPanel(Size(1000, 1000))
window(-10, 1010, -10, 1010)
title("Key 'Esc': escape")
zeichne (0,0, 1000, 1, 0, 6)
Das folgende Programm findet alle magischen 3x3-Quadrate durch stupides Ausprobieren.
Die am Ende ausgegebene Zahl ist die Fakultät welcher Zahl?
Wenn man die Variable n auf den Wert 4 endet, braucht das Programm sehr lange - grob überschlagen auf meinem Rechner 3 Jahre!
Wer kann das Programm verbessern?
# Erzeuge magisches Quadrat
import time
n = 3
def magisch():
for x in range(0,n):
zeilensumme = 0
spaltensumme = 0
for y in range(0,n):
spaltensumme = spaltensumme + a[x][y]
zeilensumme = zeilensumme + a[y][x]
if zeilensumme != summe or spaltensumme != summe:
return False
erste_diagonalsumme = 0
zweite_diagonalsumme = 0
for x in range(0,n):
erste_diagonalsumme = erste_diagonalsumme + a[x][x]
zweite_diagonalsumme = zweite_diagonalsumme + a[x][n - 1 - x]
if erste_diagonalsumme != summe or zweite_diagonalsumme != summe:
return False
return True
def trage_ein(e):
global anzahl
for x in range(0, n):
for y in range(0, n):
if a[x][y] == 0:
a[x][y] = e
if e > 1:
trage_ein(e - 1)
else:
anzahl = anzahl + 1
if anzahl % 100000 == 0:
print(anzahl)
print(time.clock() - startzeit)
if magisch():
print(a)
a[x][y] = 0
a = [[0 for y in range(0,n)] for x in range(0,n)]
anzahl = 0
summe = n * (n * n + 1) // 2
startzeit = time.clock()
trage_ein(n * n)
print(anzahl)
print(time.clock() - startzeit)
===== Link zur Kursseite =====
[[lehrkraefte:snr:informatik:glf21|Zur Kursseite]]