【楼梯间哲学:用代码破解人生选择困境】
各位观众朋友们,今天咱们不聊宇宙起源也不谈人生意义,就蹲在楼梯口数台阶!假设你现在被困在楼梯间,面前有n级台阶,每次只能跨1步装矜持或2步耍帅,问:有多少种方法能优雅登顶?
基础版:递归——用暴力美学数台阶
function climbStairs(n) {
if(n === 1) return 1; // 跳一阶
if(n === 2) return 2; // 跳两阶
return climbStairs(n-1) + climbStairs(n-2); // 组合
}
行为大赏:
这代码就像个选择困难症患者,站在第n阶台阶反复纠结:
"我是从n-1阶蹦上来的?还是从n-2阶扑上来的?"
结果就是疯狂自我复制,计算量呈指数级爆炸
进阶版:记忆化递归——装个记事本
const f = [];
var climbStairs = function (n) {
if (n === 1) return 1;
if (n === 2) return 2;
if (f[n] === undefined) {
f[n] = climbStairs(n - 1) + climbStairs(n - 2);
}
return f[n];
};
climbStairs(5);
终极版:动态规划——从搬砖工到包工头
//f(n)=f(n-1)+f(n-2)//动态推导方程式
//动态规划
var climbStairs=function(n){
const f=[]
f[1]=1
f[2]=2
for(let i=3;i<=n;i++)
{
f[i]=f[i-1]+f[i-2]
}
return f[n]
}
假设n阶有fn(n)种爬法,n-1有fn(n-1)种爬法,n-2有fn(n-2)种爬法,要先逆向推导出公式先,我们来看
递归,爬楼梯,从n阶楼梯往回退一次只有两种退法,往回退1阶或者2阶,当假设我们fn(n)是到达n阶的方法数时,我们回退一次,会得到n-1和n-2的方法数量(fn(n-1)和fn(n-2)),逆向分析,方法数是想加的,我们知道只有两种走法,那我们从n阶走到0阶时,刚开始是不是只有两个选择,像一个分岔路口,左边到家的走法有多少种,右边有多少种,那我们在分岔路口到家的走法是不是两边路口方法数的总和即fn(n)=fn(n-1)+fn(n-2),公式推导出,剩下的正向组合
性能天梯榜
| 版本 | 时间复杂度 | 内存开销 | 适用场景 |
|---|---|---|---|
| 基础递归 | 2ⁿ爆炸 | 爬楼梯式 | 演示用(n<30,否则会卡成PPT) |
| 记忆化递归 | O(n)匀速 | 存钱罐型 | 中等规模数据(面试够用版) |
| 动态规划 | O(n)平稳 | 仓库型 | 大规模数据(工程实战版) |