zoukankan      html  css  js  c++  java
  • JS递归状态回退

    export default (str) => {
        if (str.length < 1) return []
        // 映射数组
        const map = ['', 1, 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz'];
        if (str.length < 2) return map[str].split('')
    
        const numArr = str.split("");
        // 返回数组
        let code = [];
        numArr.forEach(item => {
            code.push(map[item])
        });
        // 拆分函数
        let comb = (arr) => {
            // 临时数组
            let temp = [];
            // 遍历数组第一项
            for (let i = 0, il = arr[0].length; i < il; i++) {
                // 第二项
                for (let j = 0, jl = arr[1].length; j < jl; j++) {
                    // 将拆分的每一项填入temp
                    temp.push(`${arr[0][i]}${arr[1][j]}`)
                }
            }
            arr.splice(0, 2, temp);
            if (arr.length > 1) {
                comb(arr);
            } else {
                return temp
            }
            return arr[0]
        }
        return comb(code);
    }

    在上述代码中做了两次返回 return temp return arr[0]

    在一般函数中是不需要的,JS中递归是同步的,有一个状态回推的抽象概念

    也就是说当length大于2进入递归中,这个时候else中的return实际返回的位置是

     这里也是我之前踩的坑记录一下,在length大于2时进入了递归状态,当递归函数执行完后,实际上返回值是呈现在了if中

    这个时候继续执行递归前的函数状态,那么是不走else的,而且每次执行函数在堆中开辟的空间都是独立的,所以这里temp也拿不到递归函数中的值

  • 相关阅读:
    [BZOJ1143/2718]祭祀river/毕业旅行
    [BZOJ4403]序列统计
    [BZOJ2006][NOI2010]超级钢琴
    [BZOJ2005][NOI2010]能量采集
    [BZOJ3631][JLOI2014]松鼠的新家
    第一个spring,总结!
    第一个spring,第五天。
    第一次spring,第三天。
    第一个spring,第一天。
    软件工程课程设计——第一个Spring
  • 原文地址:https://www.cnblogs.com/tengx/p/12690434.html
Copyright © 2011-2022 走看看