记得我春招美团第三轮主管面试的时候被问到递归题。总结下来一般第三轮总管面试很喜欢出一些非常规的题目来考验大家。当时自己很慌,其实对递归不是很深入的了解。所以没有面试成功,也与美团失之交臂。其实我们程序员最经典的算法就是递归,所以建议大家还是很认真的去对待一下。以下我总结了面试中常被问到的递归题,大家认真看懂之后应该能够应付面试中的问题。
1.序
递归是计算机科学中的一个重要概念。它是许多其他算法和数据结构的基础。然而,对于许多初学者来说,掌握它可能是一件非常棘手的事情。
实现调用自身的函数的诀窍在于,每当递归函数调用自身时,它都会将给定的问题拆解为子问题。递归调用继续进行,直到到子问题无需进一步递归就可以解决的地步。
为了确保递归函数不会导致无限循环,它应具有以下属性:
1一个简单的基本案例(basic case)(或一些案例) —— 能够不使用递归来产生答案的终止方案。
2一组规则,也称作递推关系(recurrence relation),可将所有其他情况拆分到基本案例。
注意,函数可能会有多个位置进行自我调用。
【摘要】 递归具有很多的优点,它可以将一个大的问题划分为小的子问题,然后再逐步细分,达到解决问题的目的。递归的实现借用了栈桢的建立和销毁,所以它是很方便的。但是递归也有一些缺点,比如说,如果递归调用太深,栈桢消耗过大,就会出现栈溢出的问题,因此,在我们使用递归之前,应该仔细考虑适不适合使用递归来解决这个问题。同时,递归深度太深,也会使得运算时间大大增加,所以递归的结论一般都是在理论的基础上的。
递归算法的时间复杂度:递归的总次数*每次递归的数量。
递归算法的空间复杂度:递归的深度*每次递归创建变量的个数。
2.题目
2.1 吃苹果问题
每天吃三分之一再加一个,到最后一天只有一个。
public static void main(String[] args) {
System.out.println(getNum(3));
}
static int dp = 0;
public static int getNum(int n) {
if (n == 1) {
return 1;
}
dp = 1 + getNum(n - (n / 3 + 1));
return dp;
}
2.2 数组中最大值
tatic int res = Integer.MIN_VALUE;
public static int getMax(int[] nums, int n) {
if (n == 0) {
return res;
}
res = Math.max(nums[n], getMax(nums, n - 1));
return res;
}
2.3用递归调用的方法求n!
public class Test23 {
public static void main(String[] args) {
System.out.println(fo(5));
}
public static int fo(int n){
if(n<2){
return 1;
}else{
return n*fo(n-1);
}
}
}
2.4 用递归法求和1+2+3+4…+n
public class Test23 {
public static void main(String[] args) {
System.out.println(add(5));
}
public static int add(int m){
if(m < 2){
return 1;
}else{
return m+add(m-1);
}
}
}
2.5一列数的规则如下: 1、1、2、3、5、8、13、21、34… 求第30位数是多少, 用递归算法实现。
public class Test23
public static void main(String[] args) {
System.out.println(find(7));
}
public static int find(int n){
if (n <= 0){
return 0;
} else if(n > 0 && n <= 2){
return 1;
}
return find(n-1)+find(n-2);
}
}
2.6将一整数逆序后放入一数组中(要求递归实现) Ex : 1234 变为 {4,3,2,1}
public class Test23 {
public static void main(String[] args) {
int[] res =