
引子
如题,今天做题目做到此题一下子将我沉睡四个月的高中数学知识唤起,思索半天才慢慢想到他的名字——马尔科夫链,但是后面经过请教得知此题可能对高中生来说是一道马尔科夫链的题,但是这题和其有一定的区别,这里人工阐述不太清楚,故引用我在敲代码的时候问通义的回答,实际上这题属于的是斐波那契数列
“爬楼梯问题本质上是斐波那契数列的变体,而非马尔科夫链模型。虽然两者都涉及递推关系,但斐波那契数列的确定性递推性质与爬楼梯问题的解法完全一致,而马尔科夫链的概率性状态转移特性并不适用于这一确定性计数问题。”(这里只引用了一个概况,具体文本篇幅较大,可自行查百度/问AI)
由于这题需要一定的分析,故就不和其他的笔记一样直接放示例代码标注释来理解了,以下为解题思路
分析
我们先画下台阶

正推:
- 如果只有一级台阶的话,小明只有一种走法【走一步】
- 如果只有俩级台阶的话,小明则有俩种走法【1.走一步->走一步;2.走俩步】
这么一看,正推似乎找不到什么规律,果断放弃
逆推:
- 当小明此时处于第19级台阶上时,他只有一种走法,就是从19走一步到20层
- 当小明处于第18级台阶上时,那么他有俩种走法(吗?):
- 1.走一步到19->走一步到20
- 2.走俩步到20
看到了我的高亮+斜体标注说明这一步绝对不寻常,但是这里我们只模拟了俩次,可能看不出来有什么,所以我打算在往下模拟一层,这样子就能很好的找到规律了
3.当小明处于第17级台阶上时,他有???种走法,我们不妨来列举一下:
- 1.走一步(17->18)+走一步(18->19)+走一步(19->20)
- 2.走一步(17->18)+走俩步(18->20)
- 3.走俩步(17->19)+走一步(19->20)
现在就比较容易看出来规律了:
我们发现:从19到20的时候只有一种方法,我们只需要考虑在19阶的基础上考虑19->20的爬法;
当我们处于18阶的时候,18->20只有俩种爬法,但是真的如此吗?其实第一种,也就是我高亮的那一个方法,这种走法已经包括了19->20的走法,即当小明在18阶的时候在爬一阶,这种走法已经包括在19阶的走法之中了(是不是有点难理解,已经尽量简化语言了),因为我走一级到19,不就只剩下19到20的走法了吗,我觉得有个成语很好形容这个走法——殊途同归,我们从不同的走法过来,但是最后只剩下同一种方法过去。所以,为了不重复计算爬上去的方法,小明在18层往上爬的方法只剩下一种了,就是从18层走俩步到19层。
那么此时我们得到一个规律:20个台阶的爬法=19个台阶的爬法+18个台阶的爬法
或许你会问:要不要考虑17个台阶的爬法?,答案是不需要的,因为如果我们在17的时候,无论他走一步还是俩步,都和18,19的走法一样了(如走法1,3和19的走法一样;走法2和18的走法2一样)他走一步就是18,那么往后就是18的走法了,他走俩步就是19,那么往后就是19的走法了
自此我们题目分析已经完成了:20个台阶的爬法=19个台阶的爬法+18个台阶的爬法
而至于18和19俩个台阶的爬法,我们套娃20个台阶就可以了,所以这题我们可以用递归的思想去编写代码
以下就是示例代码了
示例代码
public class Test {
public static void main(String[] args) {
int count = getCount(20);//定义层数并交给计算方法
System.out.println(count);
}
public static int getCount(int n) {
if (n == 1) {
return 1;//如果只有一层,那么只有一种爬法
}
if (n == 2) {
return 2;//如果只有俩层,那么只有俩种爬法
}
//俩层之后就要用递归了
return getCount(n - 1) + getCount(n - 2);//返回上一层与上上一层的爬法和,其中通过递归来获取上一层与上上一层的爬法
}
}
此时,我不禁有一个疑问,如果小明能一口气走1层,2层,3层台阶,那么应该怎么分析呢?
代码会贴在评论区
评论