递归
先说递归是什么? 它是一种循环的类型,他是一种特殊的循环。他的好处是为了把复杂的代码简便化,加强代码的可读性,简单来说就是把原理需要30行的代码现在写15行就可以了。学会了对编程的速度有提升的,最重要的是的面试会问啊,不然我都不一定学。
举个例子比如:给yuangongData下面添加一个tongguo:false可以通过arr.forEach()方法执行实现函数递归。
<template>
<div class="login">
<button @click="tianjia(yuangongData)">添加一个</button>
</div>
</template>
<script>
export default {
data() {
return {
yuangongData: [
{
Id: 0,
yuangong_id: 0,
name: '员工管理',
vid: 2,
status: 1,
xingxiList: [
{
Id: 0,
yuangong_id: 0,
name: '员工管理',
vid: 2,
status: 1,
xingxiList: [
{
Id: 0,
yuangong_id: 0,
name: '员工管理',
vid: 2,
status: 1,
xingxiList: []
}
]
},
{
Id: 0,
yuangong_id: 0,
name: '员工管理',
vid: 2,
status: 1,
xingxiList: [
{
Id: 0,
yuangong_id: 0,
name: '员工管理',
vid: 2,
status: 1,
xingxiList: []
}
]
}
]
},
{
Id: 0,
yuangong_id: 0,
name: '员工管理',
vid: 2,
status: 1
},
{
Id: 0,
yuangong_id: 0,
name: '员工管理',
vid: 2,
status: 1,
xingxiList: [
{
Id: 0,
yuangong_id: 0,
name: '员工管理',
vid: 2,
status: 1
}
]
}
]
}
},
methods: {
tianjia(list) {
list.forEach((v, k) => {
v.tongguo = false
if (v.child) {
this.tianjia(v.child)
}
})
console.log(list)
}
}
}
</script>
<style lang="less" src="../assets/css/module/login.less">
* {
padding: 0%;
}
</style>
注意:使用递归函数时需要注意函数终止条件,避免死循环
递归函数说白了就是在函数体内调用自己的一个函数(通俗的说:也就是自己调自己,自给自足);
迭代
迭代是重复反馈过程的一个活动,其目的通常是为了逼近所需目标或结果,其实对于上句话大家有学过for循环,知道for循环的执行流程,就不难理解这句话了。
为什么我们要使用迭代器呢?是因为在我们日常使用的for循环中可能会经历循环出错 比如yuangongData数组长度只有3,但是你的索引却跑到了4。逻辑稍微失误,就导致程序不能正常运行。
举个栗子:我们使用for循环遍历集合时,容易出错,但是我们使用类似forEach的话,就会减少空指针引用的问题
let arr=[1,2,3,4,5,6]
arr.forEach(item => console.log(item)) //打印1,2,3,4,5,6.总共打印六次
// 此时可以不用i来操作集合了。
// 当然如果需要index的也可以
arr.forEach((item,index) => console.log(item+'-'+index))//打印1-0,2-1,3-2,4-3,5-
4,6-5.总共打印六次
常用的几种迭代数组方法:
arr.map(回调函数)
arr.filter(回调函数)
arr.forEach(回调函数)
递归和迭代的区别
他们的区别是递归与迭代都是循环的一种,简单比较如下:
- 在代码的结构上,递归是重复调用函数本身实现循环,迭代是通过循环的结构实现的。
- 在结束方式上,递归当满足终止条件时就会逐层返回再结束,而迭代是直接使用计数器一直到结束循环。
- 在执行效率上,迭代的效率明显高于递归。这是因为递归需要占用大量系统资源,如果递归深度很大,系统资源可能会不够用。
- 在编程实现上,递归可以很方便的把数学公式转换为程序,易理解,易编程。迭代虽然效率高,不需要系统开销,但不容易理解,编写复杂问题时比较麻烦。