美文网首页
递归总结应用

递归总结应用

作者: 幸宇 | 来源:发表于2021-03-17 16:55 被阅读0次

说到递归,一直以来在工作中的确是有用到过,但并没有进行总结和进一步的理解,看到前人做过很多的总结,这里也自己整理记录一下,方便日后翻阅;
1、什么是递归?
在js中,我们写页面,写函数,写方法的时候用到过,简单来说,递归就是在一个函数的方法里 调用 自己;

2、怎么去写递归?
首先设置终止条件,满足条件则返回;否则,重复调用自身;举个粒子:
a、实现 1234n的值?

var funVal=function(n){
//设置终止条件
if(n<=1) return 1;
//否则重复调用自身
return funVal(n-1) * n
}

b、求第n项的值,斐波那契数列:1,1,2,3,5,8,13...第n项值是多少?
很显然从第3项起是前面两项的数值的和,那么终止条件就有了,如果n==1 || n==2 返回 1;

var fibo = function(n){
// 如果是第一项或者第二项,则直接返回1
if(n==1||n==2) return 1;
//否则的话,返回前两项的和
return fibo(n-1)+fibo(n-2)
}
console.log(fibo(5))

3、工作中用到递归的时候
a、深拷贝取值

 当我们对象是json格式的对象时,没有特殊函数的时候,可以用到递归的思想来取到我们想要的数据:
**数据格式:**

copydata:[
        'abc',
        {
          name:zx,
          content:{
            c:2
          }
        },
        {
          arr:['3',4,'5']
        }
      ],

***方法:***

//判断是否是对象
    isObject(obj){
      var type = typeof obj;
      return type === 'function' || type === 'object' && !!obj;
    },

    //用递归的方式进行深拷贝
    deepClone(obj){
      if(!this.isObject(obj)) return obj;         //判断是否是对象或者是数组,如果不是则返回原始值

      var result = new obj.constructor();         //创建一个对象返回;巧妙避免对当前数据是数组还是对象的判断
      
      for(var i in obj){
        if(obj.hasOwnProperty(i)){
          result[i] = this.deepClone(obj[i]);
        }
      }
      return result;
    },

***调用:***
let obj = this.deepClone(this.copydata)
console.log("copyobj======",obj)

b、遍历元素所有子节点

dom 结构:


<template>
  <div class="hello" id="hello">
    <div>递归调用</div>
    <p>这是文字。。。。。</p>
  </div>
</template>

方法:

//递归遍历元素的所有子节点 给每个元素节点添加'data-index'属性
    /**
     * @param {节点或元素} root 要递归的节点或元素
     * @param {function} callback 每一次遍历的回调函数
     * 
     */
    getChildNodes(root,callback){
      // 判断是否存在子元素
      if(root && root.children && root.children.length){
        //将子元素转换成可遍历的数组
        Array.from(root.children).forEach(node=>{
          callback && typeof callback === 'function' && callback(node);
          //递归子元素,重复上面操作
          this.getChildNodes(node,callback)
        })
      }
    },

调用:
const root = document.getElementById('hello');
    this.getChildNodes(root,function(node){
      console.log(node,"node=====")
      node.setAttribute('data-index','123')
  })

image.png

c、遍历树形结构

数据:
tree:{
        name: '电脑',
        children: [
          {
            name: 'F盘',
            children: [
              {
                name: '照片',
                children: []
              },
              {
                name: '文件',
                children: [
                  {
                    name: '工作文件',
                    children: [
                      {
                        name: '报告',
                        children: []
                      }
                    ]
                  }
                ]
              }
            ]      
          },
          {
            name: 'E盘',
            children: [
              {
                name: '视频',
                children: [
                  {
                    name: 'js教程',
                    children: []
                  }
                ]
              }
            ]
          }
        ]

      }


方法:采用深度优先原则
// 树形结构递归  遍历树形结构深度优先原则:就是顺着一个节点延伸下去,先遍历它的第一个子节点,
    // 然后是第一个孙节点,然后重孙节点,直到没有子节点为止。即先纵深遍历完之后在遍历同级的其他节点。
    deepTraversal(root,cb){
      let that = this;
      if(!root) return;
      cb && typeof cb === 'function' && cb(root);
      if(root.children && root.children.length){
        var i = 0,node;
        for(;node=root.children[i++];){
          that.deepTraversal(node,cb);
        }
      }
    }

调用:
//遍历树形结构
    this.deepTraversal(this.tree,function(node){
      console.log("打印名字=====",node.name)
    })
image.png

相关文章

  • 递归总结应用

    说到递归,一直以来在工作中的确是有用到过,但并没有进行总结和进一步的理解,看到前人做过很多的总结,这里也自己整理记...

  • 算法设计与分析——4.递归算法与递归函数

    4.1 引言 递归是程序设计中常用的解决问题的方法,它在数据结构的构造和算法设计中都要重要的应用。总结出利用递归求...

  • python数据结构教程 Day6

    python数据结构教程 Day6 本节重点 递归定义 递归调用的实现 简单递归的应用 一、递归 在python基...

  • 递归

    本文主要内容有: 1、递归的样子2、递归简介3、递归特点4、递归分析方法5、递归程序模板6、递归程序调试7、总结8...

  • 数据结构与算法第六讲 - 递归

    本讲内容 递归的定义递归的特性递归的写法递归的应用 思考题:推荐注册返佣金某app,用户 A 推荐用户 B 来注册...

  • 递归的Java实现

    算法 数据结构——递归的运行机制:递归的微观解读 递归是一种应用非常广泛的算法(或者编程技巧)。递归求解问题的分解...

  • 递归

    递归应用场景 递归的概念 简单的说:递归就是方法自己调用自己,每次调用时传入不同的变量递归有助于编程者解决复杂的问...

  • callee

    callee的应用,用于写递归函数,调用自身

  • java中常见的递归使用场景

    一、递归概述 程序调用自身的编程技巧称为递归.递归作为一种算法在程序设计语言中广泛应用。递归需具备的条件: 子问题...

  • Python札记20_递归、传递

    在Python中函数也是一种对象,有几种特别的应用: 递归函数 传递函数 嵌套函数 递归 递归又称为递回,是指在函...

网友评论

      本文标题:递归总结应用

      本文链接:https://www.haomeiwen.com/subject/fkdecltx.html