请自行清除注释查看效果。
最后希望是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)
//未优化结束