Это классический пример рекурсивной функции , функции, которая вызывает сама себя.
Если вы внимательно прочитаете его, вы увидите, что он будет вызывать сам себя, или, recurse , снова и снова, пока не достигнет так называемого базового случая , когда x <= 1
В этот момент он начнет «отслеживать» и суммировать вычисленные значения.
Следующий код четко распечатывает след алгоритма:
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));
}
}
Вывод следующий:
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
Древовидное изображение трассы будет выглядеть примерно так:
fib 4
fib 3 + fib 2
fib 2 + fib 1 fib 1 + fib 0
fib 1 + fib 0 1 1 1
1 1
При написании рекурсивных функций следует учитывать следующие важные моменты:
1. Позаботьтесь о базовом случае
Что бы произошло, если бы мы забыли if (x<=1) return 1;
в приведенном выше примере?
2. Удостоверьтесь, что рекурсивные вызовы как-то уменьшаются по отношению к базовому случаю
Что бы произошло, если бы мы случайно изменили алгоритм для возврата fibonacci(x)+fibonacci(x-1);