Betrachten Sie ein altes, bekanntes Problem :
In der Mathematik ist der größte gemeinsame Teiler (gcd)… von zwei oder mehr Ganzzahlen ungleich Null die größte positive Ganzzahl, die die Zahlen ohne Rest teilt.
Die Definition von gcd ist überraschend einfach:
Dabei ist mod der Modulo-Operator ( dh der Rest nach der Ganzzahldivision).
Im Englischen besagt diese Definition, dass der größte gemeinsame Teiler einer Zahl und Null diese Zahl ist und der größte gemeinsame Teiler zweier Zahlen m und n der größte gemeinsame Teiler von n und der Rest nach Division von m durch n ist .
Wenn Sie wissen möchten, warum dies funktioniert, lesen Sie den Wikipedia-Artikel zum euklidischen Algorithmus .
Berechnen wir als Beispiel gcd (10, 8). Jeder Schritt ist gleich dem unmittelbar davor:
- gcd (10, 8)
- gcd (10, 10 mod 8)
- gcd (8, 2)
- gcd (8, 8 mod 2)
- gcd (2, 0)
- 2
Im ersten Schritt ist 8 nicht gleich Null, daher gilt der zweite Teil der Definition. 10 mod 8 = 2, weil 8 einmal mit einem Rest von 2 in 10 geht. In Schritt 3 gilt der zweite Teil erneut, diesmal jedoch 8 mod 2 = 0, weil 2 8 ohne Rest teilt. In Schritt 5 ist das zweite Argument 0, daher lautet die Antwort 2.
Haben Sie bemerkt, dass gcd sowohl auf der linken als auch auf der rechten Seite des Gleichheitszeichens angezeigt wird? Ein Mathematiker würde sagen, dass diese Definition rekursiv ist, da der Ausdruck, den Sie definieren, innerhalb seiner Definition wiederkehrt .
Rekursive Definitionen sind in der Regel elegant. Eine rekursive Definition für die Summe einer Liste lautet beispielsweise
sum l =
if empty(l)
return 0
else
return head(l) + sum(tail(l))
Dabei head
ist das erste Element in einer Liste und tail
der Rest der Liste. Beachten Sie, dass sum
sich die Definition am Ende wiederholt.
Vielleicht möchten Sie stattdessen den Maximalwert in einer Liste bevorzugen:
max l =
if empty(l)
error
elsif length(l) = 1
return head(l)
else
tailmax = max(tail(l))
if head(l) > tailmax
return head(l)
else
return tailmax
Sie können die Multiplikation nicht negativer Ganzzahlen rekursiv definieren, um daraus eine Reihe von Additionen zu machen:
a * b =
if b = 0
return 0
else
return a + (a * (b - 1))
Wenn das Umwandeln der Multiplikation in eine Reihe von Additionen keinen Sinn ergibt, erweitern Sie einige einfache Beispiele, um zu sehen, wie es funktioniert.
Zusammenführungssortierung hat eine schöne rekursive Definition:
sort(l) =
if empty(l) or length(l) = 1
return l
else
(left,right) = split l
return merge(sort(left), sort(right))
Rekursive Definitionen gibt es überall, wenn Sie wissen, wonach Sie suchen müssen. Beachten Sie, dass alle diese Definitionen sehr einfache Basisfälle haben, z gcd (m, 0) = m. Die rekursiven Fälle lösen das Problem auf, um zu den einfachen Antworten zu gelangen.
Mit diesem Verständnis können Sie jetzt die anderen Algorithmen in Wikipedia's Artikel über Rekursion schätzen !