🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 递归 递归函数是一个自我调用的函数。可以编写递归的 Lambda 表达式,但需要注意:递归方法必须是实例变量或静态变量,否则会出现编译时错误。 我们将为每个案例创建一个示例。 这两个示例都需要一个接受**int**型参数并生成**int**的接口: ~~~java // functional/IntCall.java interface IntCall { int call(int arg); } ~~~ 整数 n 的阶乘将所有小于或等于 n 的正整数相乘。 阶乘函数是一个常见的递归示例: ~~~java // functional/RecursiveFactorial.java public class RecursiveFactorial { static IntCall fact; public static void main(String[] args) { fact = n -> n == 0 ? 1 : n * fact.call(n - 1); for(int i = 0; i <= 10; i++) System.out.println(fact.call(i)); } } ~~~ 输出结果: ~~~ 1 1 2 6 24 120 720 5040 40320 362880 3628800 ~~~ 这里,`fact`是一个静态变量。 注意使用三元**if-else**。 递归函数将一直调用自己,直到`i == 0`。所有递归函数都有“停止条件”,否则将无限递归并产生异常。 我们可以将`Fibonacci`序列用递归的 Lambda 表达式来实现,这次使用实例变量: ~~~java // functional/RecursiveFibonacci.java public class RecursiveFibonacci { IntCall fib; RecursiveFibonacci() { fib = n -> n == 0 ? 0 : n == 1 ? 1 : fib.call(n - 1) + fib.call(n - 2); } int fibonacci(int n) { return fib.call(n); } public static void main(String[] args) { RecursiveFibonacci rf = new RecursiveFibonacci(); for(int i = 0; i <= 10; i++) System.out.println(rf.fibonacci(i)); } } ~~~ 输出结果: ~~~ 0 1 1 2 3 5 8 13 21 34 55 ~~~ 将`Fibonacci`序列中的最后两个元素求和来产生下一个元素。