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也拿不到递归函数中的值

原文地址:https://www.cnblogs.com/tengx/p/12690434.html

时间: 2024-11-15 06:34:46

JS递归状态回退的相关文章

uva 10795 - A Different Task (递归+状态转移)

题目链接:uva 10795 - A Different Task 思路来源于:点击打开链接 题意: 新汉若塔问题,有n个盘子,放在3个盘子上,给你一个初始状态和一个结束状态,问你最小步数怎样到达. 思路: 递归+状态转移,直接从初态到末态好像不是那么好办,对最大的一块n,首先肯定要把他放在末态的位置上,假设开始在1号位置,要放到3号位置,那么必须先到达这个状态s:1~n-1必须都从大到小放在2上面,然后放n,然后将1~n-1转移到末态,由对称性,也即可以变为末态转移到状态s,那么处理起来就可以

js 递归学习

作用:将一些复制的算法变为简单,比如:(举例子)计算数组 var  a =[1,3,4,6,7,8]的长度:求 5!的值,也可以做搜索用等. //求数组的长度function len(arry){ if(arry[0] == null && arry[0]==undefined) return 0; else{ arry.shift(); return 1+ len(arry) } } //求5! function factorial(n){ if(n == 0 ){ return 1;

vue.js的状态管理vuex中store的使用

一.状态管理(vuex)简介 vuex是专为vue.js应用程序开发的状态管理模式.它采用集中存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.vuex也集成刀vue的官方调试工具devtools extension,提供了诸如零配置的time-travel调试.状态快照导入导出等高级调试功能. 二.状态管理核心 状态管理有5个核心,分别是state.getter.mutation.action以及module.分别简单的介绍一下它们: 1.state state为

java递归、js递归,无限极分类菜单表

java-json import com.alibaba.fastjson.JSONObject; import java.util.ArrayList; import java.util.List; /** * @Description: 菜单工具类 * @version: V1.0 */ public class MenuTreeUtil { /** * @return * @Author * @Param nodes :所有的节点列表 */ public List data(List<JS

js异步状态监控

说明:写这篇文章,是希望被吐槽的. 一.背景 在做报表页面的时候,页面上有很多的异步加载,而设计的loading是个全局的,一个页面就有一个. 控制loading什么时候出现,什么时候消失,要实时的知道页面上异步加载的东西是否执行完毕,只有所有的异步都加载完,loading才能停止. 并且,如果用户操作了页面,某个局部又要开始加载,loading要被通知到,执行loading效果. 问题的难点有两个: 1.怎么知道所有的异步都加载完闭了呢? 2.如何通知loading? 二.思路 1.思路一 设

js递归实现包名转换成对应的层级对象c

示例:由原对象{a: {test: 1, b: 2}} 根据a.b.c.d这样的包名转换为:{"a":{"test":1,"b":{"c":{"d":{}}}}} 说明:包名有"."分隔,本身代表着层级结构,而json对象本身也是由属性和值构成的,允许嵌套,因此现在就有一个需求,把包的描述字符串,转换成json类型,条件是要注意到已经存在的其他属性.本例中属性a的值是对象,因此要保留该,

js 递归

<script> //递归 function test(n) { if (n == 1) { return 1 } console.log(n) return n * test(n - 1) } console.log(test(3)) </script>

JS递归

普通写法: var twoLevel = data['result']; //console.log(twoLevel.length); 4 var html = ""; for (var i = 0; i < twoLevel.length; i++) { var threeLevel = twoLevel[i].children; if (threeLevel.length > 0) { html += "<li><a class='inac

js处理json js递归

1 <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> 2 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">