提交 2f99266f 编写于 作者: qq_36480062's avatar qq_36480062

commit

上级 6d77c48c
package Math;
public class 斐波拉切数列详解 {
public static void main(String[] args) {
}
}
package Math;
/**
* 当有n个盘子在A上,先把n-1个盘子放在C盘子上,再把最大的盘子放在B上
* 再把那n-1个盘子放回B上面
* 即:f(n)=2f(n-1)+1
* 盘子数量 移动次数
* 1 1
* 2 3
* 3 3*2+1
* <p>
* 不难得出数学通项公式为,f(n)=2^(n-1)
* 推导过程:f(n-1)=(2^n-1)-1 提出假设
* 则代入递推式可得:f(n)=2((2^n-1)-1)+1=2^n-2+1=2^n-1
*/
public class 汉诺塔 {
public static void main(String[] args) {
}
public static long han(int n) {
long[] dp = new long[n];
dp[0] = 1;
for (int i = 1; i < n; i++) {
dp[i] = dp[i - 1] * 2 + 1;
}
return dp[n - 1];
}
public static long haNN(int n) {
return (long) (Math.pow(2, n) - 1);
}
public static void Test() {
for (int i = 1; i < 32; i++) {
if (han(i) != haNN(i)) {
System.out.println(i);
}
}
}
}
......@@ -94,7 +94,7 @@ public class 矩阵快速幂 {
* 使用矩阵快速幂求,斐波拉切数列第n项
*
* @param n 斐波拉切数列第n项
* @return 使用矩阵快速幂求,斐波拉切数列第n项
* @return 使用矩阵快速幂求, 斐波拉切数列第n项
*/
public static long fib(int n) {
long[][] c = {{0, 1}, {1, 1}};//f(n)=f(n-1)+f(n-2)
......@@ -103,5 +103,4 @@ public class 矩阵快速幂 {
return res[0][0];
}
}
package dp;
/**
* 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
* 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
* 注意:给定 n 是一个正整数。
* 给出1-5阶楼梯的走法
* 5 4 3 2 1
* <p>
* 1 1 1 1 1 1 1 1 1 1 1 1 1
* 1 2 1 1 1 2 1 1 1
* 1 1 2 1 1 1 2 1 2
* 1 1 1 2 2 1 1 2 1
* 1 2 2 2 2 2
* 2 2 1
* 2 1 2
* 2 1 1 1
* <p>
* 对比1和2,来推导3
* 3 2 1
* 1 1 1 1(+2)
* 1 1(+1)
* 1 2
* 2 1 2(+1)
* <p>
* 对比2和3,来推导4,需要再走两步或者一步
* 4 3 2
* 1 1 1 1 1 1 1(+1)
* 1 2 1 1 1(+2)
* 1 1 2 1 2(+1)
* 2 1 1 2 1(+1)
* 2 2 2(+2)
* <p>
* 对应起来:可知dp[i] = dp[i - 1] + dp[i - 2]
* dp[i]语义就是走i阶楼梯能有多少种选择
* <p>
* 大白话:把已知的数据存在数组里,作为基本条件,然后再根据数组语义找出dp方程,
* 也就是前面得到的答案可以推出后面的答案
*/
public class 上楼梯 {
public static void main(String[] args) {
System.out.println(dpp(4));
System.out.println(dp(4));
}
/**
* f(n)=f(n-1)+f(n-2)
*
* @param n
* @return
*/
public static int dpp(int n) {
int[] dp = new int[n];
dp[0] = 1;
dp[1] = 2;
for (int i = 2; i < n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n - 1];
}
/**
* 变态上楼梯,无论多少阶楼梯,都可以一步跨上去
* 楼梯阶数 方法数量
* 1 1
* 2 2
* 3 4
* 4 8
* 5 1+2+4+8+1=16
* 则:f(n)=n-1∑i=1 f(i)+1
* 假设n阶楼梯数学通项公式为:f(n)=2^(n-1)
* 则f(n-1)=2^(n-2)
* 代入递推式 f(n)=n-1∑i=1 f(i)+1 =1+2+4+2^(n-2)+1
* =2^(n-1)-1+1=2^(n-1)
* 几何级数
*
* @param n
* @return
*/
public static int dp(int n) {
return (int) Math.pow(2, n - 1);
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册