JavaScript递归的一些理解

递归一般用于树的遍历、对象深拷贝、无限分层菜单等用途,然而这个东西理解起来真的很别扭,这里写出一个自己的理解方式。
以一个递归生成包含从1到2的数组函数为例:

function digui( i ){
    var arr = []
    i++
    if( i < 3){
        arr.push(i)
        arr = arr.concat( digui(i) )
    }
    return arr
}
console.log(digui(0))

说一下运行过程:
首先传入参数0,运行digui(0)
判断1<3,arr.push(1),所以当前arr是[1]
继续执行:[1].concat(运行digui(1),必须等待digui(1)返回结果才能继续运行)
开始执行digui(1)
判断2<3,arr.push(2) ,当前arr是[2]
继续执行:[2].concat(运行digui(2),必须等待digui(2)返回结果才能继续运行)
判断3 == 3,所以运行return arr,arr是[],到此最内层递归结束,开始向上回溯
计算[2].concat([]),并把结果赋值给arr,arr当前是[2],返回arr,供上一层递归使用,本层结束
计算[1].concat([2]),并把结果赋值给arr,arr当前是[1, 2],返回arr,没有上一层了,函数运行结束
可以看出递归的效果是从最内层开始向外返回值
比如这个方法:

function dg(i){
    i++
    if(i < 3){
        dg(i)
    }
    console.log(i)
    return i
}
dg(0) // 3 2 1

是按照3->2->1的顺序打印的,而不是1->2->3;
最后来个实用点的,深拷贝对象:

function deepClone(obj){
    var temp = {};
    for(var key in obj){
        if(obj.hasOwnProperty(key)){
            temp[key] = typeof obj[key] === "object" ? deepClone(obj[key]) : obj[key];
        }
    }
    return temp;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

毕竟我是大神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值