该部分主要是对递归的一个应用,同样也可以作为动态规划的基础题目去思考。
1、跳台阶
/**
*
* @author 崔洪振367
* @version 创建时间:2017年6月28日 下午9:24:40
*/
public class 跳台阶 {
public int JumpFloor(int target) {
if(target == 1){
return 1;
}
if(target ==0){
return 0;
}
if(target == 2){
return 2;
}
return JumpFloor(target-1) + JumpFloor(target-2);
}
}
2、斐波那契数列
/**
*
* @author 崔洪振367
* @version 创建时间:2017年6月28日 下午9:11:03
*/
public class 斐波那契数列 {
// public int Fibonacci(int n) {
//
// // 利用递归来实现
// if (n <= 0) {
// return 0;
// }
//
// if (n == 1) {
// return 1;
// }
// return Fibonacci(n - 1) + Fibonacci(n - 2);
//
// }
public int Fibonacci2(int n) {
// 利用循环来实现
if(n <=0){
return 0;
}
if(n == 1){
return 1;
}
int a = 0;
int b = 1;
int sum = 0;
for(int i=2; i<=n; i++){
sum = a+b;
a = b;
b = sum;
}
return sum;
}
}
3、变态跳台阶
/**
*
* @author 崔洪振367
* @version 创建时间:2017年6月29日 下午3:38:16
*/
public class 变态跳台阶 {
//通过递归来实现变态跳台阶
public int JumpFloorII(int target) {
if(target == 0){
return 1;
}
if(target == 1){
return 1;
}
return 2*JumpFloorII(target-1);
}
// //可以通过迭代来实现变态跳台阶
// public int JumpFloorII1(int target){
// if(target == 0) {
// return 0;
// }
//
// int[] dp = new int[target + 1];
// dp[0] = 1;
// dp[1] = 1;
//
// for(int i = 2;i <= target;i++) {
// dp[i] = 0;
// for(int j = 0;j < i;j++) {
// dp[i] += dp[j];
// }
// }
//
// return dp[target];
// }
}
4、矩形覆盖
解决此题的思路:可以试着找出1-4之间的覆盖情况,然后可以发现:后一个覆盖情况是前两个覆盖情况的变种。在前一种覆盖方式和一个2*1的组合。
package 剑指offer;
/**
*
* @author 崔洪振367
* @version 创建时间:2017年6月29日 下午4:05:19
*/
public class 矩形覆盖 {
//我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。
//请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
public int RectCover(int target) {
if(target == 0){
return 0;
}
if(target == 1 || target == 2){
return target;
}
return RectCover(target-1) + RectCover(target-2);
}
}