JavaScript学习笔记—递归

1. 编写递归函数,一定要包含两个要件编写递归函数,一定要包含两个要件

(1)基线条件:递归的终止条件
(2)递归条件:如何对问题进行拆分

2. 递归的核心思想

  • 将一个大的问题拆分为一个个小的问题,小的问题解决了,大的问题也就解决了

递归的作用和循环是一致的,不通电在于,递归的思路比较清晰简洁,循环的执行性能比较好
调函数自身过程中,会产生函数作用域,调几次就会产生几次,产生函数作用域会开辟内存空间

// 创建一个函数,可以用来求任意数的阶乘
/*
  1! 1
  2! 1 x 2 = 2
  3! 1 x 2 x 3 = 6
  ......
  10! 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 = xxx
*/
function jieCheng(num) {
  // 创建一个变量用来记录结果
  let result = 1;
  for(let i = 2; i <- num; i++) {
    result *= i;
  }
  return result;
}
let result = jieCheng(3)
console.log(result); // 6

// 用递归解决阶乘问题
/*
  5! = 4! x 5
  4! = 3! x 4
  3! = 2! x 3
  2! = 1! x 2
  1! = 1
*/
function jieCheng2(num){
  // 基线条件
  if(num === 1){
    return 1;
  }
  // 递归条件
  // num! = (num - 1)! * num
  return jieCheng2(num-1) * num;
}
result = jieCheng2(5);
console.log(result); // 120
/*
  jieCheng(5)
    - return jieCheng2(4) * 5
     - return jieCheng2(3) * 4
      - return jieCheng2(2) * 3
       - return jieCheng2(1) * 2
        - return 1
*/

3. 递归练习

一对兔子出生后的两个月后每个月都能生一对小兔子
编写一个函数,可以用来计算第n个月的兔子的数量
1 2 3 4 5 6 7 8 9 10 11 12
1 1 2 3 5 8 13 21 34 55...
规律:当前数等于前两个数之和(斐波那契数列)

// 求斐波那契数列中的第n个数
function fib(n) {
  // 确定基线条件
  if(n < 3) {
    return 1;
  }
  // 设置递归条件
  // 第n个数 = 第n-1个数 + 第n-2个数
  return fib(n - 1) + fib(n - 2);  
}
let result = fib(8);
console.log(result); // 21
posted @ 2023-01-24 20:14  码农张3  阅读(24)  评论(0)    收藏  举报