递归以及递归的简单应用 JavaScript

分手后的思念是犯贱 2022-09-11 07:24 326阅读 0赞

递归以及递归的简单应用

执行上下文[代码的执行环境]

全局执行上下文

函数执行上下文

eval执行上下文(已经很少使用了,不推荐使用)

执行上下文调用栈[先进后出]

  1. 全局上下文入栈
  2. 函数上下文入栈
  3. 函数上下文出栈
  4. 全局上下文出栈

递归

当不满足条件时,函数调用自身,满足条件时,递归返回。

*递归实现阶乘

  1. function play(num) {
  2. // 2.此时num=3,判断num不等于1,跳过if
  3. // 4.此时num=2,判断num不等于1,跳过if
  4. // 6.此时num=1,return 1,此时play(1)的结果为1
  5. if (num == 1) {
  6. return 1;
  7. }
  8. // 3.进入play(2)函数
  9. // 5.进入play(1)函数
  10. // 7. 执行play(1)的结果和2相乘 1*2==2
  11. // 8.执行play(2)的结果和3相乘 2*3==6
  12. // 9.返回结果为6
  13. return ((play(num - 1) * num))
  14. }
  15. // 1.首先执行log,然后进入play函数
  16. // 10.打印结果
  17. console.log(play(3))

快速排序【快排】

  1. 在数据集之中,选择一个元素作为”基准”
  2. 所有小于”基准”的元素,都移到”基准”的左边;所有大于”基准”的元素,都移到”基准”的右边。
  3. 对”基准”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

    //声明一个数组,存放需要排序的数
    var arr = [5, 3, 8, 44, 2, 1, 12, 15, 21, 35]

    1. function quick(list) {
    2. //左边的数组
    3. let left_arr = [];
    4. //右边的数组
    5. let right_arr = [];
    6. //用来存放基数
    7. let basic = list[0];
    8. //如果数组长度小于等于1,则返回数组
    9. if (list.length <= 1) {
    10. return list;
    11. }
    12. // 循环每个数,如果小于基数则放左数组,如果大于基数则放右数组
    13. for (let i = 1; i < list.length; i++) {
    14. if (list[i] < basic) {
    15. left_arr.push(list[i]);
    16. } else {
    17. right_arr.push(list[i]);
    18. }
    19. }
    20. //返回一个数组,将左边数组,基数,和右边数组拼接起来
    21. return [].concat(quick(left_arr), basic, quick(right_arr));
    22. }
    23. console.log(quick(arr));//[1, 2, 3, 5, 8, 12, 15, 21, 35, 44]

浅拷贝

复制出来的对象在修改时对原来的对象造成了影响

3种浅拷贝:

  1. 复制了引用的地址
  2. 复制了对象但没有完全复制,对象中的对象类型值复制了地址
  3. 使用Object.assign()将y的内容全部复制到x中。

    // 浅拷贝

    1. var obj = {
    2. name: 'jack',
    3. age: 20,
    4. work: ['写代码', '打麻将', '接外包']
    5. }
    6. // 1.复制了引用的地址
    7. var a = obj;
    8. a.name = 'rose'
    9. console.log(a);
    10. console.log(obj)
    11. // 2.虽然创建了对象,但是并没有完全创建对象
    12. var b = {
    13. ...obj
    14. };
    15. b.work[1] = '修电脑'
    16. console.log(b);
    17. console.log(a);
    18. // 3.将y的内容全部复制到x中
    19. var x = {
    20. };
    21. var y = {
    22. name: 'jack',
    23. list: [1, 2, 3]
    24. }
    25. var result = Object.assign(x, y);

深拷贝

复制出来的对象在修改时不会对原来的对象造成影响。

2种深拷贝:

  1. 使用JSON转换。(函数无法拷贝、undefined的值无法拷贝)
  2. 使用递归

    //深拷贝
    //1.使用JSON进行深拷贝(函数无法拷贝、undefined的值无法拷贝)

    1. var str = JSON.stringify(phone);
    2. phone2 = JSON.parse(str);
  1. //2.使用递归进行深拷贝
  2. var girl = {
  3. name: 'kk',
  4. age: '18',
  5. hobby: ['sing', 'swim', 'run'],
  6. pet: {
  7. dog: 'bt',
  8. cat: 'tt'
  9. }
  10. }
  11. var girl2 = {
  12. };
  13. function deepCopy(target, source) {
  14. //循环source中的每一项
  15. for (let i in source) {
  16. // 如果这一项的类型为object型
  17. if (typeof(source[i]) == 'object') {
  18. // 如果存在长度,则为数组
  19. if (source[i].length) {
  20. p = []
  21. // 否则为对象
  22. } else {
  23. p = {
  24. }
  25. }
  26. // 目标对象的这一项递归调用此函数,将此项复制
  27. target[i] = deepCopy(p, source[i]);
  28. } else {
  29. // 如果不为object类型,则为普通数据类型,直接赋值
  30. target[i] = source[i]
  31. }
  32. }
  33. return target;
  34. }
  35. console.log(deepCopy(girl2, girl));
  36. girl2.pet = {
  37. dog: 'hh',
  38. pet: 'bb'
  39. }
  40. console.log(girl2)
  41. console.log(girl)

发表评论

表情:
评论列表 (有 0 条评论,326人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java应用

    一、概念   简单的说: 递归就是方法自己调用自己   递归有助于解决复杂的问题,可以让代码变得简洁 二、能解决什么样的问题     ![1007094-201