从另一个函数调用一个函数的想法立即暗示了一个函数调用自身的可能性。Java 中的函数调用机制支持这种可能性,称为递归。递归是一种强大的通用编程技术,是许多至关重要的计算应用程序的关键,从为信息处理提供基本支持的组合搜索和排序方法(第 4 章)到用于信号处理的快速傅立叶变换(第9)。
你的第一个递归程序。递归的HelloWorld是实现阶乘函数,对正整数N的定义由等式
N! = N × (N-1) × (N-2) × ... × 2 × 1
N!使用 for 循环很容易计算,但 Factorial.java 中更简单的方法是使用以下递归函数:
public static int factorial(int N) {
if (N == 1) return 1;
return N * factorial(N-1);
}
您可以通过注意到 factorial() 返回 1 = 1 来说服自己它会产生所需的结果!当 N 为 1 并且如果它正确计算值
(N-1)! = (N-1) × (N-2) × ... × 2 × 1
然后它正确计算值
N! = N × (N-1)! = N × (N-1) × (N-2) × ... × 2 × 1
我们可以像跟踪任何函数调用序列一样跟踪这个计算。
factorial(5)
factorial(4)
factorial(3)
factorial(2)
factorial(1)
return 1
return 2*1 = 2
return 3*2 = 6
return 4*6 = 24
return 5*24 = 120
我们的 factorial() 实现展示了每个递归函数所需的两个主要组件。
The base case returns a value without making any subsequent recursive calls. It does this for one or more special input values for which the function can be evaluated without recursion. For factorial(), the base case is N = 1.
The reduction step is the central part of a recursive function. It relates the function at one (or more) inputs to the function evaluated at one (or more) other inputs. Furthermore, the sequence of parameter values must converge to the base case. For factorial(), the reduction step is N * factorial(N-1) and N decreases by one for each call, so the sequence of parameter values converges to the base case of N = 1.
Now in your case (n==1) is the base condition or terminating condition.
recurse(4,'A','B','C')
recurse(3,'A','C','B')
recurse(2,'A','B','C')
recurse(1,'A','C','B')
return : 1 A C
return : 2 A B
return : 3 A C
return : 4 A B
final output :
1 A C
2 A B
3 A C
4 A B