js递归函数详解

2023-10-17  本文已影响0人  扶得一人醉如苏沐晨

一、递归函数

何为递归

  • 递:一层一层的进去
  • 归:一层一层的回来
  • 递归函数:一个函数内部,调用了自己,循环往复

递归终点

  • 当递归不设置的终点的时候,就会陷入死循环
  • 设置的终点使用 return(return作用就是终止函数执行)

注意:写递归先写停 return

下面这个代码就是一个最简单的递归函数

在函数内部调用了自己,函数一执行,就调用自己一次,在调用再执行,循环往复,没有止尽

function fn() {
  fn();
}
fn();

注意:递归慎用,能用循环解决的事情,尽量别用递归

二、递归案例

2.1、需求: 求 1 至 5 的和(15)

1. 先算 1 + 2 得 3
2. 再算 3 + 3 得 6
3. 再算 6 + 4 得 10
4. 再算 10 + 5 得 15
5. 结束

写递归函数先要写结束条件(为了避免出现 “死递归”)

设置终点结束条件

function sum(n) {
  //传递进来的是1
  //当n==1的时候结束
  if (n == 1) {
    return 1;
  }
}
console.log(sum(1)); // 1

再写不满足条件的时候我们的递归处理

function sum(n) {
  //传递进来的是5
  //当n==1的时候结束
  if (n == 1) {
    return 1;
  }
  //不满足条件的时候,就是当前数字 + 比自己小 1 的数字
  return n + sum(n - 1);
}
console.log(sum(5)); // 15

2.2、递归求阶乘

一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积

并且 1 的阶乘为 1

自然数 n 的阶乘写作 n!

2.2.1、例子:求 3 的阶乘(321)

3 的阶乘 =
=> 3 * 2 的阶乘
    => 2 * 1 的阶乘
        => 1 的阶乘就是 1
从上往下就是 递 的过程
从下往上就是 归 的过程
function fn(n) {
  // n 就是你要求的终点
  if (n === 1) {
    // 设置终点位置
    return 1;
  }
  // 当 n 不是 1 的时候
  // 就递进去
  return n * fn(n - 1);
}
fn(3); // 6

代码分析

第一次:
    n = 3 , if(n===1)不成立
    return 3 * fn(2)
    fn(3) = 3 * fn(2)
第二次:
    n = 2 , if(n===1)不成立
    return 2 * fn(1)
    fn(3) = 3 * fn(2)
          = 3 * 2 * fn(1)
第三次:
    n = 1 , if(n===1) 成立
    return 1
    fn(3) = 3 * fn(2)
          = 3 * 2 * fn(1)
          = 3 * 2 * 1 = 6

2.3、递归求最大公约数

最大公约数:指两个或多个整数共有约数中最大的一个

如果数 a 能被数 b 整除,a 就叫做 b 的倍数,b 就叫做 a 的约数。

约数和倍数都表示一个整数与另一个整数的关系,不能单独存在。如只能说16是某数的倍数,2是某数的约数,而不能孤立地说16是倍数,2是约数。

2.3.1、需求分析

求最大公约数会用到辗转相除法
先确定终点:
    => a % b ===0
    => b 就是最大公约数
未到终点时:
    => 计算相对小的数字,和两个数字的余数

2.3.2、书写代码

function fn(a, b) {
  // 保证 a > b
  if (a < b) {
    var tmp = a;
    a = b;
    b = tmp;
  }
  // 设置终点
  if (a % b === 0) {
    return b;
  }
  // 未到终点
  return fn(b, a % b);
}
console.log(fn(2, 4)); // 2

2.3.3、代码分析

第一次:
    a = 2 , b = 4 , if(a < b)成立
    a = 4 , b = 2 , if(a % b === 0)成立
    return b (b = 2) 返回结果,结束递归

2.4、递归求斐波那契数列

斐波那契数列指的是这样一个数列:

1 1 2 3 5 8 13 21 34 55 …

这个数列从第3项开始,每一项都等于前两项之和

2.4.1、需求分析

=> 第一位和第二位是固定的 1
=> 第三位开始依次是前两位的和
    => 确定终点
        => n 是你要求第几位
        => 当 n 等于 1 或者 2 的时候,表示你要求第一位或者第二位
    => 没到终点之前
        => 你要求第 n 位,实际上就是 n-1 和 n-2 位的和

2.4.2、书写代码

function fn(n) {
  // n 就是要求的第 n 位
  //  设置终点
  if (n === 1 || n === 2) {
    return 1;
  }
  // 未到终点
  return fn(n - 1) + fn(n - 2);
}
console.log(fn(10)); // 55
上一篇 下一篇

猜你喜欢

热点阅读