递归
设计递归方法
在设计递归方法时请记住,你需要:
-
**基本情况。**这将定义递归何时停止并输出结果。因子示例中的基本案例是:
if (n <= 1) { return 1; }
-
**递归调用。**在此语句中,你使用更改的参数重新调用该方法。上面的析例示例中的递归调用是:
else { return n * factorial(n - 1); }
输出
在此示例中,你计算第 n 个阶乘数。第一个因素是:
0! = 1
1! = 1
2! = 1 x 2 = 2
3! = 1 x 2 x 3 = 6
4! = 1 x 2 x 3 x 4 = 24
…
Java 和 Tail-call 消除
当前的 Java 编译器(直到并包括 Java 9)不执行尾部调用消除。这会影响递归算法的性能,如果递归足够深,则可能导致 StackOverflowError
崩溃; 在 Java 中看到深度递归是有问题的