浅谈js递归

  • 递归的本质就是函数内部调用本函数。
  • 要避免递归出现死循环,一定要有一个结束标志(临界条件)。
  • 一定要搞清楚递归的关系。
  • 递归可以将复杂/抽象的问题简单化。

下面通过一些例子好好的感受一下吧

1、求1-100的和

/*
    分析:1-100的和就是1+2+3+4+..+100
    1-100的和等于1-99的和+100
    1-99的和等于1-98的和+99
    1-98的和等于1-97的和+98
    ...
    1的和等于1
*/
// sum函数的意思是获取1+2+3+..+n的和
function sum(n) {
    // 结束条件
    if (n == 1) {
        return 1
    } else {
        return sum(n - 1) + n
    }
}
console.log(sum(100))    // 5050

2、斐波那契数列

示例:0 1 1 2 3 5 8 13 21…

/*
    分析:
    第一位是0
    第二位是1
    第三位等于第二位+第一位
    第四位等于第三位+第二位
    那么以此类推
    第n位就是第(n-1)位+(n-2)位的和

    第一位第二位就是临界值
*/
function fn(n) {
    if (n == 1) {
        return 0
    }
    else if (n == 2) {
        return 1
    } else {
        return fn(n - 2) + fn(n - 1)
    }
}
console.log(fn(8))  // 13
console.log(fn(20)) // 4181

3、计算n的阶乘

数学公式:n!=1×2×3×…×(n-1)×n

/*
    分析:
    1! = 1
    2! = 1!*2
    3!=2!*3
    以此类推
    n!=(n-1)!*n
*/
function fn(n) {
    // 结束条件
    if(n==1) {
        return 1
    }else {
        // 递归关系
        return fn(n-1)*n
    }
}
console.log(fn(3))  // 6
console.log(fn(10)) // 3628800

4、递归遍历JSON树

// 获取某个id的name属性值
var arr = [
    {
        id: 1,
        name: '理科',
        children: [
            {
                id: 3,
                name: '数学',
                children: [
                    {
                        id: 9,
                        name: '线性代数'
                    },
                    {
                        id: 10,
                        name: '高数'
                    }
                ]
            },
            {
                id: 4,
                name: '物理'
            },
            {
                id: 5,
                name: '化学'
            },
            {
                id: 6,
                name: '生物'
            }
        ]
    },
    {
        id: 2,
        name: '文科',
        children: [
            {
                id: 7,
                name: '语文'
            },
            {
                id: 8,
                name: '英语'
            }
        ]
    }
]

function fn(data, id) {
    for (let i = 0; i < data.length; i++) {
        if (data[i].id == id) {
            return data[i].name
        }
        if (data[i].children) {
            return fn(data[i].children, id)
        }
    }
}
arr.map(item => {
    let res = fn([item], 7)
    if (res) {
        console.log(res) // 语文
    }
})

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值