跳台阶( ( 考点: 递归和循环) )
题目描述一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级。求该青蛙跳上一个 n 级的台阶?
public int JumpFloor(int target) {
if (target <= 0) {
return -1;
} else if (target == 1 || target == 2) {
return target;
} else {
return JumpFloor(target - 1) + JumpFloor(target - 2);
}
}
变态跳台阶( ( 考点: 递归和循环) )
题目描述
一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级……它也可以跳上 n 级。求
该青蛙跳上一个 n 级的台阶总共有多少种跳法?
public int JumpFloorII(int target) {
if (target <= 0) {
return -1;
} else if (target == 1) {
return 1;
} else {
return 2 * JumpFloorII(target - 1);
}
}
矩形覆盖( ( 考点: 递归和循环) )
题目描述
我们可以用 2*1 的小矩形横着或者竖着去覆盖更大的矩形。请问用 n 个 2*1 的
小矩形无重叠地覆盖一个 2*n 的大矩形,总共有多少种方法?
public int RectCover(int target) {
if (target < 1) {
return 0;
} else if (target == 1 || target == 2) {
return target;
} else {
return RectCover(target - 1) + RectCover(target - 2);
}
}
总结:其实所有的这类简单的规律类算法笔试题目,都有一个笨办法,那就是找规律,列出n由1开始增加后对应的不同的结果,如果结果和n前几个总是相等的,那尽量多列出几个,防止陷阱。数据得出之后利用二元一次方程(a*n+b=结果)的解法求出它们的关系,得出a和b的值,然后着手编程。当然这种方法效率不高,如果我们想高质量的利用编程实现,以递归方法为例,那么最好是把得出的值与之前的值进行比较,找出规律。这个时候你会发现,世界真奇妙,用递归解决起来如此简单。