递归

设计递归方法

在设计递归方法时请记住,你需要:

  • **基本情况。**这将定义递归何时停止并输出结果。因子示例中的基本案例是:

    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 中看到深度递归是有问题的