3.4. Zyklus (Wiederholung) – Rekursion

Rekursives Programmieren setzt insbesondere das Verstehen von Funktionen mit Parametern voraus.

Funktionen mit Parametern

In Python-Programmen mit einer tkinter-GUI können neben den Callback-Funktionen auch andere Funktionen – darunter rekursive Funktionen – deklariert werden.

Definition
Begriff »Funktion mit Parametern«

Eine Funktion ist ein Unterprogramm, das in einem Programm wiederholt aufgerufen werden kann.

Die Funktionsdeklaration:

  • def<Funktionsname>(<formaler oder formale Parameter>):
    • <Anweisungesblock>

Der Funktionsaufruf:

  • <Funktionsname>(<aktueller oder aktuelle Parameter>)

Ein Beispiel einer Funktion mit einem formalen Parameter und ohne Rücksprungwert an die rufende Stelle sowie die Aufrufe der Funktion mit aktuellen Parametern.

Quelltext der Funktion »gruessen« und deren Aufrufe
# rekursive Funktion
def gruessen(pgruss):
	print(f"{pgruss} vom Meer.")

# Funktionsaufrufe	
gruessen("Hallo")
gruessen("Guten Tag")
gruss="Moin"
gruessen(gruss)

Erklärungen zum Quelltext
2. und 3. Zeile Die Funktion »gruessen« mit dem formalen Parameter »pgruss« wird deklariert.
3. Zeile Mit »print« wird der f-Sring »f"{pgruss} vom Meer."« in der Python-Konsole ausgegeben, nicht in der grafischen Benutzeroberfläche – dem Hauptfenster.
6. bis 9. Zeile Die Funktion wird viermal mit unterschiedlichen aktuellen Parametern aufgerufen.
6. Zeile Die Funktion wird mit dem aktuellen Parameter »"Hallo"« aufgerufen.
7. Zeile Die Funktion wird mit dem aktuellen Parameter »"Guten Tag"« aufgerufen.
8. Zeile Der Variable »gruss« wird der Wert "Moin" zugewiesen.
9. Zeile Die Funktion wird mit dem aktuellen Parameter – dem Wert der Variable »gruss« – aufgerufen.

Hinweis: Er ist empfehlenswert, die formalen Parameter in den Funktionsdeklarationen besonders zu kennzeichnen (z. B. durch den Kleinbuchstaben p am Anfang). Dadurch ist es besser möglich, die aktuellen von den formalen Parametern zu unterscheiden.

Ein Beispiel einer Funktion mit einem formalen Parameter und dem Rücksprungwert an die rufende Stelle sowie den Aufrufen der Funktion mit aktuellen Parametern.

Quelltext der Funktion »potenz« und deren Aufrufe
# rekursive Funktion
def potenz(pn):
	return pn*pn

c=11
# Funktionsaufrufe
a=potemz(3)
b=potenz(7)
d=potenz(c)

Erklärung zum Quelltext
2. bis 3. Zeile Die Funktion »potenz« mit dem formalen Parameter "pn" wird deklariert.
3. Zeile Die Anweisung »return pn*pn« zum Rücksprung an die rufende Stelle mit dem Wert »pn*pn«.
6. Zeile Der Variable »c« wird der Wert 11 zugewiesen. Die Variable wird in der 9. Zeile im Funktionsaufruf als aktualler Parameter verwendet.
7. bis 9. Zeile Die Funktion wird dreimal mit unterschiedlichen aktuellen Parametern aufgerufen.
7. Zeile Die Funktion wird in der Wertzuweisungen der Variablen »a« mit den aktuellem Parametern 3 aufgerufen.
Der Rücksprungwert der Funktion wird der Variable »a« zugewiesen.
8. Zeile Die Funktion wird in der Wertzuweisungen der Variablen »b« mit den aktuellem Parametern 7 aufgerufen.
Der Rücksprungwert der Funktion wird der Variable »b« zugewiesen.
9. Zeile Die Funktion wird in der Wertzuweisungen der Variablen »d« mit dem Wert der Variable »c« als aktuellem Parametern aufgerufen.
Der Rücksprungwert der Funktion wird der Variable »d« zugewiesen.

Nachfolgend ein Beispiel einer Funktion mit zwei formalen Parametern und dem Rückgabwert an die rufende Stelle sowie den Aufrufen der Funktion mit aktuellen Parametern.

Quelltext der Funktion »mittelwert« und deren Aufrufe
# rekursive Funktion
def mittelwert(pzahl1, pzahl2):
    return (pzahl1+pzahl2)/2.0
 
zahl1=20.7
zahl2=4.3  
# Funktionsaufrufe
d1=mittelwert1.8, 3.2)
d2=mittelwert(6.9, 10.1)
d3=mittelwert(zahl1, zahl2)

Erklärungen zum Quelltext
2. und 3. Zeile Die Funktion »mittelwert« mit den formalen Parametern »pzah1« und »pzah2l« wird deklariert.
3. Zeile Der Rücksprung »return« an die rufende Stelle erfolgt mit dem Wert von »(pzahl1+pzahl2)/2«, wobei der Operator / die Division von Gleitkommazahlen ist.
5. Zeile Der Variable »zahl1« wird der Wert 20.7 zugewiesen. Die Variable wird in der 10. Zeile im Funktionsaufruf als aktualler Parameter verwendet.
6. Zeile Der Variable »zahl2« wird der Wert 4.3 zugewiesen. Die Variable wird in der 10. Zeile im Funktionsaufruf als aktualler Parameter verwendet.
8. Zeile Die Funktion wird in der Wertzuweisung der Variable »d1« mit dem aktuellen Parametern 1.8 und 3.2 aufgerufen.
Der Rücksprungwert der Funktion wird der Variable »d1&aquo; zugewiesen.
9. Zeile Die Funktion wird in der Wertzuweisung der Variable &aquo;d2« mit dem aktuellen Parametern 6.9 und 10.1 aufgerufen.
Der Rücksprungwert der Funktion wird der Variable »d2« zugewiesen.
8. Zeile Die Funktion wird in der Wertzuweisung der Variable »d3« mit den Werten der Variablen »zahl1« und »zahl2« als aktuelle Parametern aufgerufen.
Der Rücksprungwert der Funktion wird der Variable »d3« zugewiesen.
Übung

Aufgabe A36

Gib die Werte an, die den Variablen »d1«, »d2« und »d3« von der Funktion »mittelwert« als als Rückgabewerte zugewiesen werden.

Abschließend zu Funktionen mit Parametern

In einer Funktionsdeklaration können ein formaler oder mehrere formale Parameter stehen:

  • die Funktion »gruessen« hat einen formalen Parameter »pgruss«
  • die Funktion »potenz« hat einen formalen Parameter »pn«
  • die Funktion »mittelwert« hat zwei formalen Parameter »pzahl1« und »pzahl2«

Jeder formale Parameter wird innerhalb der Funktion wie eine Variable verwendet.

Seinen Wert erhält jeder formale Parameter durch die Übergabe des aktuellen Parameters im Aufruf der Funktion. Das heißt, dem formalen Parameter wird der aktuelle Parameter des Funktionsaufrufs zugewiesen

Übung

Aufgabe A37

Gegeben ist die Funktion »f« und drei Aufrufe der Funktion in den Wertzuweisungen der Variablen »zahl1«, »zahl2« und »zahl3«:

  • gib die Namen der formalen Parameter der Funktion an
  • gib die Namen der aktuellen Parameter in den Aufrufen der Funktion an
  • gib die Werte der Variablen »zahl1«, »zahl2« und »zahl3« an
Quelltext der Funktion »f« und deren Aufrufe
def f(px, py, pz):
    return px*(py+pz)

x=5
y=6
z=7
zahl1=f(2, 3, 4) 
zahl2=f(-6, -4, 5)
zahl3=f(x, y, z)