用 Java 进行函数式编程 - 递归



递归是在满足特定条件之前在一个函数中调用同一函数。它有助于将大问题分解成小问题。递归还使代码更易于阅读和表达。

命令式与递归

以下示例显示了同时使用这两种技术计算自然数总和。

public class FunctionTester {
   public static void main(String[] args) {
      System.out.println("Sum using imperative way. Sum(5) : " + sum(5));
      System.out.println("Sum using recursive way. Sum(5) : " + sumRecursive(5));
   }

   private static int sum(int n){
      int result = 0;
      for(int i = 1; i <= n; i++){
         result = result + i;
      }
      return result;
   }

   private static int sumRecursive(int n){
      if(n == 1){
         return 1;
      }else{
         return n + sumRecursive(n-1);
      }
   }
}

输出

Sum using imperative way. Sum(5) : 15
Sum using recursive way. Sum(5) : 15

使用递归,我们将 n-1 个自然数的和的结果与 n 相加,从而获得所需的结果。

尾递归

尾递归表示递归方法调用应在最后进行。以下示例显示了使用尾递归打印数字序列。

public class FunctionTester {
   public static void main(String[] args) {
      printUsingTailRecursion(5);
   }

   public static void printUsingTailRecursion(int n){
      if(n == 0) 
         return;
      else
         System.out.println(n);
      printUsingTailRecursion(n-1);
   }
}

输出

5
4
3
2
1

头递归

头递归表示递归方法调用应在代码开头进行。以下示例显示了使用头递归打印数字序列。

public class FunctionTester {
   public static void main(String[] args) {     
      printUsingHeadRecursion(5);
   }

   public static void printUsingHeadRecursion(int n){
      if(n == 0) 
         return;
      else
         printUsingHeadRecursion(n-1); 
      System.out.println(n);
   }
}

输出

1
2
3
4
5
广告