递归的三种解法 LeetCode70

193 阅读2分钟

【楼梯间哲学:用代码破解人生选择困境】

各位观众朋友们,今天咱们不聊宇宙起源也不谈人生意义,就蹲在楼梯口数台阶!假设你现在被困在楼梯间,面前有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)平稳仓库型大规模数据(工程实战版)