Dies ist ein klassisches Beispiel für eine recursive function, eine Funktion, die sich selbst aufruft.
Wenn Sie es sorgfältig zu lesen, werden Sie sehen, dass es selbst nennen, oder, recurse, immer und immer wieder, bis es den so genannten Basisfall erreicht, wenn x <= 1
, an den es beginnt Punkt um "zurück zu verfolgen" und die berechneten Werte zusammenzufassen.
Der folgende Code druckt deutlich die Spur des Algorithmus aus:
public class Test {
static String indent = "";
public static int fibonacci(int x) {
indent += " ";
System.out.println(indent + "invoked with " + x);
if (x <= 1) {
System.out.println(indent + "x = " + x + ", base case reached.");
indent = indent.substring(4);
return 1;
}
System.out.println(indent + "Recursing on " + (x-1) + " and " + (x-2));
int retVal = fibonacci(x-1) + fibonacci(x-2);
System.out.println(indent + "returning " + retVal);
indent = indent.substring(4);
return retVal;
}
public static void main(String... args) {
System.out.println("Fibonacci of 3: " + fibonacci(3));
}
}
Der Ausgang ist die folgende:
invoked with 3
Recursing on 2 and 1
invoked with 2
Recursing on 1 and 0
invoked with 1
x = 1, base case reached.
invoked with 0
x = 0, base case reached.
returning 2
invoked with 1
x = 1, base case reached.
returning 3
Fibonacci of 3: 3
Ein Baum Darstellung der Spur würde in etwa so aussehen
fib 4
fib 3 + fib 2
fib 2 + fib 1 fib 1 + fib 0
fib 1 + fib 0 1 1 1
1 1
Die wichtigen Teile, über die beim Schreiben rekursiver Funktionen nachgedacht wird, sind:
1. Achten Sie auf den Basisfall
Was passiert wäre, wenn wir if (x<=1) return 1;
im Beispiel oben vergessen hatte?
2. Stellen Sie sicher, dass die rekursive Aufrufe irgendwie in Richtung der Basisfall verringern
Was passiert, wenn wir den Algorithmus aus Versehen fibonacci(x)+fibonacci(x-1);
Wenn Sie Schwierigkeiten haben, rekursive Funktionen zu verstehen, ist es vielleicht einfacher, mit einem rekursiven Faktor zu beginnen. http://groups.engin.umd.umich.edu/CIS/course.des/cis400/cpp/factorial.html –
Um die Rekursion zu verstehen, muss man zuerst die Rekursion verstehen. Um dies zu tun, gehen Sie hier: http://stackoverflow.com/questions/717725/understanding-recursion –
'if (x <2) return x;' –