爬楼梯
递归
递归
- 函数内重复自身调用(递归改成循环就是用循环的方法实现自身调用)
limbStairs(n-1)+climbStairs(n-2)
//这个递归其实就是数列中前两个数与前一个数相加,改成如下
for(int i = 2; i < n; i++){
result = one+ two;
one = two;
two = result;
}
- 一定存在结束条件的!!!
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢
class Solution {
public int climbStairs(int n) {
//n==1就是结束条件
if(n==1){
return 1;
}
if(n==2){
return 2;
}
return climbStairs(n-1)+climbStairs(n-2);
}
}
循环
所有的递归都可以改成循环
class Solution {
public int climbStairs(int n) {
if(n <= 0) return 0;
if(n == 1) return 1;
if(n == 2) return 2;
int one = 1;
int two = 2;
int result = 0;
//递归改成循环都是根据这个自我调用的式子改的
//return climbStairs(n-1)+climbStairs(n-2);
//从递归可以看出这个是相邻的两个数相加,所以用循环实现这个过程
//重要!!!
for(int i = 2; i < n; i++){
result = one+ two;
one = two;
two = result;
}
return result;
}
}
变态爬楼梯
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
public class Solution {
public int JumpFloorII(int target) {
//分最后是跳一步还是跳两部,还是三步这些情况,相加就是
//n = n时,会有n中跳的方式,1阶、2阶...n阶,得出结论:
//f(n) = f(n-1)+f(n-2)+...+f(n-(n-1)) + f(n-n) => f(0) + f(1) + f(2) + f(3) + ... + f(n-1)
//f(n-1) = f(0) + f(1)+f(2)+f(3) + ... + f((n-1)-1) = f(0) + f(1) + f(2) + f(3) + ... + f(n-2)
//f(n) = 2*f(n-1)
if (target <= 0) {
return 0;
} else if (target == 1) {
return 1;
} else {
//2^(n-1)可以用位移操作进行 把每个数往左移一位就完成了次方的操作
//位操作的好处,速度超快,这些都是底层的二进制机器操作指令
///f(n) = 2*f(n-1) 这个是递归的指数实现,比循环更好
return 1<<(target-1);
}
}
}
矩形覆盖
循环
public class Solution {
public int RectCover(int target) {
//也是跳台阶的斐波那契,
// 第一次摆放一块 2*1 的小矩阵(竖着摆),则摆放方法总共为f(target - 1)
// 第一次摆放一块 1*2 的小矩阵(横着着摆),则摆放方法总共为f(target - 2)
//所以总方法为f(target)=f(target - 1)+f(target - 2)
if (target <= 0) {
return 0;
} else if (target == 1) {
return 1;
} else if (target == 2) {
return 2;
} else {
//要给C一个初始值,要不然java会报错
int a = 1, b = 2, c = 0;
for (int i = 3; i <= target; i++) {
c = a + b;
a = b;
b = c;
}
return c;
}
}
}
阶乘
public static int factorial2(int num){
int fa = 1;
if(num==1){
return 1;
}else{
for(int i=2;i<=num;i++){
fa*=i;
}
return fa;
}
}
}