递归的实现、特性以及思维要点

124 阅读1分钟

递归是什么

递归本质上也是一种循环,只不过通过循环体调用自己来进行所谓的循环。

一个简单的栗子

我们拿阶乘举例

function Factorial(n) {
  if (n <= 1) return 1;

  return n * Factorial(n -1);
}

// 这里拓展下 我们可以开启尾递归优化
function Factorial(n, total = 1) {
  if (n <= 1) return total;

  total *= n;

  return Factorial(n -1, total);
}

递归实际执行过程如下

递归的代码模板

记住递归的结构能让我们在遇到这类问题的时候,更快、更完整的找到问题的方法。

function recursion(level, parma1, parma1, ...) {
  // 递归终止条件 返回结果
  if (level > Max_level) return process_result;

  // 处理当前层逻辑
  process(level, data...);

  // 下探到下一层
  self.recursion(level + 1, p1, ...);

  // 清理当前层(当需要时)
  clear something..
}

递归的思维要点

  • 不要人肉进行递归(最大误区)
  • 找到最近最简的办法,将其拆解成可重复解决的问题(重复子问题),比如计算n的阶乘,我们可以把这个问题拆解成找 n 和 Factorial(n - 1)相乘的结果
  • 数学归纳法,寻找n = 1,n = 2成立,且直到 n 都成立的方法。