数据结构与算法之递归
用循环实现阶乘
阶乘的规则就是输入数字n计算乘积.例如n为3计算结果为1*2*3。此算法的时间复杂度为O(n)
public static long f1(long n) {
long sum = 1;
for (long i = n; i >= 1; i--) {
sum *= i;
}
return sum;
}
递归实现阶乘
此算法的时间复杂度为O(n)
public static long f2(long n) { if (n == 1) { return 1; } return n * f2(n - 1); }
尾递归实现阶乘
上边的递归有个特点,每次方法入栈,栈帧都会保留变量 n 因为要从下一个栈帧中返回结果后计算.这就是递归的最大缺点,如果递归方法中有大量的成员变量需要保留
在栈帧中则每次递归都需要占用大量的内存.尾递归正弥补了这个缺点.将当前帧中需要计算的步骤通过实参传递给下一个栈帧,这样当前栈帧就不需要保留任何的变量.
此算法的时间复杂度为O(n)
public static long f3(long n1, long n2) { if (n2 == 1) { return n1; } else { return f3(n1 * n2, n2 - 1); } }