JavaScript递归应用与实践

递归简单来说就是函数内调用自生的一种方法,形如:

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;
}
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值