從五個不重復(fù)的數(shù)(0-9) 選取3個為一個組合 順序了不同 最多能有多少組合?
js來寫 如果可以的話 能不用es6就不用(還不會)
ps: 我來做的話也就想到三重循環(huán)那種笨方法
要是能有簡潔的寫法就好了
在擴展一下如果也適合6個數(shù)選取4個數(shù)為一組合的就好了...
你們不要在數(shù)學(xué)算了(數(shù)學(xué)差也不會算) 我發(fā)這個問題是想用js輸出這些可以組合的數(shù)字 而不是再求數(shù)學(xué)題
第1個可能,只有5個不重復(fù)的數(shù),5個數(shù)中取3個組合,是C(5,3)=P(5,3)/(3!)=C(5,2)=P(5,2)/(2!)=5!/((5-2)!)/2!=10
第2個可能,其實是有10個不重復(fù)的數(shù),分成兩步,先選5個不重復(fù)的數(shù),再在這5個數(shù)中選3個來組合,最后的組合有多少種,其實這個問題就是在10個不同數(shù)中選3個來組合,即C(10,3)=P(10,3)/(3!)=10!/((10-3)!)/3!= 10!/(7! * 3?。?= 120
上面是以往的回答,下面是對其實質(zhì)問題的回答
的javascript實現(xiàn)
// 對N個元素取M組合的序數(shù)排列可能全輸出函數(shù)
// 其返回一個二維數(shù)組,數(shù)組長度是可能的數(shù)量,每個子數(shù)組有M個元素,每個元素值代表其取原始數(shù)組的序號。
function mcom(n,m){
var rt=[];
for (var i=0;i<Math.pow(2,n);i++){
var a=0;
var tmp=[];
for (var j=0;j<n;j++){
if(i>>j & 1){
a++;
tmp.push(j);
}
}
if(a==m){
rt.push(tmp);
}
}
return rt;
}
上面的代碼利用了位運算,其原理其實很簡單,它產(chǎn)生一個N個元素的所有可能組合(對應(yīng)于0至 111...111 的二進制數(shù),其中后面一個有N個1),然后過濾出恰好有M個1的數(shù),就是所要求的,所以這個效率其實不高的,特別是對于N很大時。
鑒于題主不理解上面實現(xiàn)的原理,我再詳細解釋一下。
對于N個不重復(fù)元素,其取得0個到N個元素組合的可能C(N,M) (0<=M<=N)如果用二進制表示,就是,用A(N)表示所有N位二進制數(shù),包括N個0的,即范圍為[0,Power(2,N)-1]的非負整數(shù)集合,可以知道對于任何組合可能其實對應(yīng)于一個A(N)內(nèi)的整數(shù),記這個數(shù)C(N,M) 其還滿足以下對應(yīng)條件:
M=0 --- C(N,0) 所有位均為0,即沒有為1的位
M=1 --- C(N,1) 有且僅有1位為1
M=2 --- C(N,2) 有且僅有2位位1
...
M=N ---C(N,N) 所有位都位1
以 樓主 開始要求的在[1,2,3,4,5]中取3個都組合 舉例就是:
元素
1 2 3 4 5
對應(yīng)的二進制數(shù) 對應(yīng)十進制數(shù) 取得的組合
1 1 1 0 0 28 1,2,3
1 1 0 1 0 26 1,2,4
1 1 0 0 1 25 1,2,5
1 0 1 1 0 22 1,3,4
1 0 1 0 1 21 1,3,5
1 0 0 1 1 19 1,4,5
0 1 1 1 0 14 2,3,4
0 1 1 0 1 13 2,3,5
0 1 0 1 1 11 2,4,5
0 0 1 1 1 7 3,4,5
可見,只要通過位運算來過濾出[0,Power(2,N)-1]的非負整數(shù)集合中滿足只有M位為1的數(shù)就可以找到對應(yīng)的組合。這就是前面算法的實現(xiàn)原理。
其中過濾操作是通過位運算 X&1
實現(xiàn),具體過濾對應(yīng)于:
for (var j=0;j<n;j++){
if(i>>j & 1){
a++;
tmp.push(j);
}
}
if(a==m){
rt.push(tmp);
}
,還是繼續(xù)上面的例子,以4,7、15分別為例,這里n=5了,m=3,
4的二進制為100,這時i=4所以有
j=0, 4>>0=4 4 & 1 =0
j=1, 4>>1=2 2 & 1 =0
j=2, 4>>2=1 1 & 1 =1, a=1, tmp=[2]
直到循環(huán)結(jié)束 a=1,tmp=[2], 因為a<m,所以rt不增加tmp這個可能
7的二進制為111,這時i=7所以有
j=0, 7>>0=7 7 & 1 =1, a=1, tmp=[0]
j=1, 7>>1=3 3 & 1 =1, a=2, tmp=[0,1]
j=2, 7>>2=1 1 & 1 =1, a=3, tmp=[0,1,2]
直到循環(huán)結(jié)束 a=3,tmp=[0,1,2], 因為a=m,所以rt增加tmp這個可能
15的二進制為1111,這時i=15所以有
j=0, 15>>0=15 15 & 1 =1, a=1, tmp=[0]
j=1, 15>>1=7 7 & 1 =1, a=2, tmp=[0,1]
j=2, 15>>2=3 3 & 1 =1, a=3, tmp=[0,1,2]
j=3, 15>>3=1 1 & 1 =1, a=4, tmp=[0,1,2,3]
直到循環(huán)結(jié)束 a=4,tmp=[0,1,2,3], 因為a>m,所以rt不增加tmp這個可能
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團,成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達內(nèi)教育集團成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負責(zé)iOS教學(xué)及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。