递归简单来说就是函数内调用自生的一种方法,形如:
function foo(){
foo()
}
复制代码
下面我列举一些常用的递归应用。
1. 求和,例如求1+2+3+4+...+100之和
分析如下:
sum(100)=sum(99)+100
sum(99)=sum(98)+99
...
sum(1)=sum(0)+1
复制代码
代码实现:
function sum(n){
if(n==1) return 1
return sum(n-1)+n
}
console.log(sum(100)) // 5050
复制代码
特意说明一下使用递归一定不要忽略退出条件,否则会陷入死循环。
2.求阶乘 例如10!
function factorial(n) {
if(n==1) return 1
return factorial(n-1)*n
}
console.log(factorial(10)) // 3628800
复制代码
3.平展组织
在实际应用之中,经常会遇到类似于组织树结构
var tree=[
{
name:'jack',
children:[
{
name:'jack2',
children:[{
name:'jack3'
}]
}
]
},{
name:'tom',
children:[
{
name:'tom2',
children:[{
name:'tom3'
}]
}
]
}
...
]
复制代码
我们往往需要对组织树进行平展来更方便我们的开发,例如我们需要得到一个所有的名称name数组等,采用递归实现如下:
var res=[]
function flatTree(arr){
for(let i=0;i<arr.length;i++){
res.push({name:arr[i].name})
if(arr[i].children.length!=0){
return flatTree(arr[i].children)
}else{
continue;
}
}
}
tree.forEach(function(item,index){
flatTree([item])
})
复制代码
4.数据分组
例如对于数组[1,5,10,15,21,26,31,36,41,50,55,70] 每隔五秒应该要有数据,如果不是每隔五秒的数据应该划入下一个组中,即分组后应该为
[
[1,5,10,15],
[21,26,31,36,41],
[50,55],
[70]
]
复制代码
实现代码如下:
unction group(data) {
if(data.length==0){
return false
}
for(let i=0;i<data.length;i++){
if (data[i+1] && (data[i+1]-data[i]<5)) {
continue;
} else {
result.push(data.splice(0,i+1))
group(data)
break
}
}
return
}
group(data)
console.log(result)
复制代码
5. 对象复制(深拷贝)
function deepCopy(obj) {
var result = Array.isArray(obj) ? [] : {};
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
if (typeof obj[key] === 'object') {
result[key] = deepCopy(obj[key]);
} else {
result[key] = obj[key];
}
}
}
return result;
}
复制代码