问答

谁能给简化一下这个for循环代码

作者:admin 2021-07-08 我要评论

CodePen代码示例 请自行清除注释查看效果。 最后希望是2个参数, 第一个数组集合。 第二个是数字(可选),如果没有,就循环整个数组,数字的意义是控制循环到哪个...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

CodePen代码示例

请自行清除注释查看效果。

最后希望是2个参数,
第一个数组集合。
第二个是数字(可选),如果没有,就循环整个数组,数字的意义是控制循环到哪个字母,比如只组合到D,就是4(或者3)。

2020.07.01 更新

或者第二个参数,控制生成字母组合的位数,比如生成2个字母的组合,或者生成3个字母的组合。

A等于1
B等于2
C等于4
D等于8
E等于16
F等于32
G等于64
H等于128
I等于256
依次类推,直到Z为止,这是原始数据吧,然后生成的字母组合,来对应字母组合相加的数值(运算结果)。
当然,字母排列也是有一定规律的,就是只会按从A到Z的顺序排列,然后组合只会出现下表中左侧的格式,而不会出现右侧的格式:

正确格式 错误格式
AB BA
AC CA
BC CB
BE EB
ABC ACB
ABD BAD
BCD DCB
... ...

希望说清楚了,汗颜抱歉,之前没有描出清楚问题。

###

我提供一个参考:

let arr=['a','b','c','d','e'];
console.log(tree_all(arr));


function tree_all(arr,len){
    len=len>0?(arr.length<len?arr.length:len):arr.length;
    var re=[];
    arr.forEach(v=>{
        re.push(v);
    })
    for(let i=1;i<len;i++){
        re=add_letter(re,arr);
    }
    return re;
}

function add_letter(re,arr){
    var r=[];
    re.forEach(v=>{
        arr.forEach(vv=>{
            r.push(v+vv);
        })
    })
    return r;
}
###

没理解你的代码要干嘛。而且你有多少个循环都没有说清楚。
你的循环有重复代码,可以写回调函数。然后你输入一个数字,在数组范围内,进行回调。你的循环里面其实逻辑是很多重复的。可以抽出来到迭代函数里面。

###

估计你需要把你 想的 需要 用数据或者用例的形式 描述出来,而不是给一大段代码,还让人去分析。
我猜,你是想有一个 特征数据集(数组集合), 然后从中抽取任意n个数据组合(不重复),对应的特征结果。
这个其实是组合遍历的问题。

// 未优化开始
function getStart(k,m){
    let rt=0;
    let bitMark=0x1;
    for(let i=0;i<k-1;i++){
        rt=rt | (bitMark<<i)
    }
    rt = rt | (bitMark<<(m-1))
    return rt;
}
var cc=0;
var CharA="ABCDEFGHIJKLMNOPQRSTUVWXYZ".split('');
function FmtOut(inNum,M){
    let inNumToB=inNum.toString(2);
    let rt="";
    for(let i=0;i<M;i++){
        if(inNum & (0x1<<i) ){
            rt=rt+CharA[i];
        }
    }
    rt=rt+" : "+ inNumToB+"b = "+ inNum
    console.log(rt);
}
function get1Num(i, m){ // 获取m位数i中为1的位数
    let rt=0;
    let bitMark=0x1;
    for(let j=0;j<m;j++){
        rt = rt+ ( ( ( bitMark<<j ) & i )>>j );//i的第j位是否为1
    }
    return rt;
}

function BCMK(M,K){
    let StartNum=getStart(K,K);
    let EndNum=StartNum<<(M-K);
    for(let i=StartNum;i<=EndNum;i++){
        if(get1Num(i,M)==K){
            FmtOut(i,M);
            cc++;
        }
    }
}
BCMK(16,6)
//未优化结束

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 谁能给简化一下这个for循环代码

    谁能给简化一下这个for循环代码

  • css返回顶部按钮设置成相对定位还是绝

    css返回顶部按钮设置成相对定位还是绝

  • DevOps和GitOps有什么区别?

    DevOps和GitOps有什么区别?

  • 如何解决websocket同时发多个消息的问

    如何解决websocket同时发多个消息的问

腾讯云代理商
海外云服务器