JS 递归函数

139 阅读3分钟

什么是递归函数

如果一个函数在内部可以调用其本身,那么这个函数就是递归函数?
递归最恰当的比喻,就是查词典。我们使用的词典,本身就是递归,为了解释一个词,需要使用更多的词。当你查一个词,发现这个词的解释中某个词仍然不懂,于是你就开始查这第二个词,可惜,第二个词里仍然有不懂的词,于是查第三个词,这个查下去,一直有一个词的解释是你万千能看懂的,那么递归走到了尽头,然后你就开始后退,逐渐明白之前查过的每一个词,最终,你明白了最开始那个词的意思。

image.png

递归的特点是什么呢?

实际上,递归有两个显著的特征,终止条件和调用自己:
调用自己:原问题可以分解为子问题,子问题和原问题的求解方法是一致的,既都是调用自身的同一个函数。
终止条件:递归必须有一个终止的条件,既不能无限循环地调用本身

image.png
其实,递归的过程,可以解释为出入栈的过程。

数组扁平化

什么是数组扁平化?

数组的扁平化其实就是一个嵌套多层的数组array(嵌套可以是任何成熟)转换为只有一层的数组
递归思路很容易理解,就是通过循环递归的方式,一项一项地去遍历,如果每一项还是一个数组,那么就继续往下遍历,利用递归程序的方法,实现数组的每一项的链接。

image.png

image.png

浅拷贝

什么是浅拷贝?

浅拷贝只复制某个对象的引用,而不复制对象本身,新旧对象还是共享同一块内存

image.png
浅拷贝:
如果对象的第一层是简单类型 拷贝的是值
如果对象的第一层是引用类型 拷贝的引用
浅拷贝的实现方法:
Object.assgin()
展开运算符{...obj}拷贝对象

深拷贝

什么是深拷贝

深拷贝(更深层次的拷贝)不管 简单类型 或者是 引用类型 拷贝都是值

image.png
如果对象的第一层是简单类型 拷贝的是值

如果对象的第一层是引用类型 先在 先对象里面 创建一个 空对象或者是空数组 接下来 进入到 这个对象里面的

实现深拷贝的常见方法:

  • 通过递归实现深拷贝
  • lodash/cloneDeep
  • 通过JSON.stringify()实现
  • 递归实现深拷贝(上)#

步骤#

  1. 定义函数 deepCopy
  2. 接收形参 oldObj
  3. 在函数体里面判断传递进来的 形参是不是 数组 如果是数组 给一个 空数组 如果不是 给 空对象

image.png

递归实现深拷贝(中)#

步骤#

  1. 遍历对象
  2. 判断 对象的属性值 是 简单类型还是引用类型 (对象|数组)
  3. 如果是 简单类型 就直接赋值给 空对象或者空数组

image.png

递归实现深拷贝(下)#

步骤#

如果是引用类型,则递归调用

image.png

使用lodash库实现深拷贝#

能够使用lodash库的cloneDeep方法实现深拷贝

步骤#

  1. 引入lodash
  2. 调用cloneDeep方法

image.png

使用JSON.stringify实现深拷贝#

能够使用JSON.stringify实现深拷贝

步骤#

  1. 将对象 转换为 json格式的字符串
  2. 将 json格式的字符串 再转换为 js对象

image.png