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