Hier ist ein Beispiel für einen rekursiven Algorithmus zur Umkehrung einer einfach verknüpften Liste. Auf einem Laptop (mit den Spezifikationen 4 GB Speicher, Intel Kern i5 2,3 GHz CPU 64 bit und Windows 7), wird diese Funktion in StackOverflow Fehler für eine verknüpfte Liste der Größe in der Nähe von 10.000 laufen.
Ich will damit sagen, dass wir die Rekursion mit Bedacht einsetzen und dabei immer den Umfang des Systems berücksichtigen sollten.
Oft kann eine Rekursion in ein iteratives Programm umgewandelt werden, das besser skaliert. (Eine iterative Version desselben Algorithmus finden Sie am Ende der Seite. Sie kehrt eine einfach verkettete Liste der Größe 1 Million in 9 Millisekunden um).
private static LinkedListNode doReverseRecursively(LinkedListNode x, LinkedListNode first){
LinkedListNode second = first.next;
first.next = x;
if(second != null){
return doReverseRecursively(first, second);
}else{
return first;
}
}
public static LinkedListNode reverseRecursively(LinkedListNode head){
return doReverseRecursively(null, head);
}
Iterative Version desselben Algorithmus:
public static LinkedListNode reverseIteratively(LinkedListNode head){
return doReverseIteratively(null, head);
}
private static LinkedListNode doReverseIteratively(LinkedListNode x, LinkedListNode first) {
while (first != null) {
LinkedListNode second = first.next;
first.next = x;
x = first;
if (second == null) {
break;
} else {
first = second;
}
}
return first;
}
public static LinkedListNode reverseIteratively(LinkedListNode head){
return doReverseIteratively(null, head);
}
0 Stimmen
Die Stapelgröße in Java ist klein. Und manchmal, z.B. bei vielen rekursiven Aufrufen, steht man vor diesem Problem. Sie können Ihren Code durch Schleifen umgestalten. Ein allgemeines Entwurfsmuster dafür finden Sie auf dieser Seite: jndanial.com/73
0 Stimmen
Eine nicht offensichtliche Möglichkeit, dies zu erreichen: Fügen Sie die Zeile
new Object() {{getClass().newInstance();}};
zu einem statischen Kontext (z. B.main
Methode). Funktioniert nicht aus dem Instanzkontext heraus (wirft nurInstantiationException
).