比如一個函數(shù)
let plus = (num)=>{
//方法
}
plus(10)
返回的結(jié)果是這樣:
10 = 1+9;
10 = 1+2+3+4;
10 = 4+6;
總之就是返回這個參數(shù)所有的可能性。這個plus函數(shù)應(yīng)該怎么寫比較合適?
我的想法是用遍歷一個[1,2,3,4,5,6,7,8,9,10]這樣的數(shù)組,但是只能遍歷固定的層數(shù),比如說兩層,三層,但是這樣十分不靈活,求指教。
借鑒樓上的ciqulover
提供的思路,感謝。
發(fā)現(xiàn)幾個問題,按照他的解法,有許多重復(fù)值,所以10的和的正整數(shù)組成的可能組合并沒有511種,而是通過過濾排序之后的41
種。
所以重新寫了一個,其中重要的是在遞歸里面循環(huán)遍歷所有可能的值時,并不需要從頭遍歷到尾,比如
for(let i = 1; i < 10; i++) {}
而是遍歷前半部分就可以了
for(let i = 1; i <= 10 / 2; i++) {}
這里之所以取等號是因為當正整數(shù)為偶數(shù)時,可以分解成相等的兩個數(shù)字,比如10 = 5 + 5
。
還有取前半部分的原因是1 + 9
和9 + 1
組成實際上的結(jié)果是一樣的。
let results = [];
function plus(num, current = []) {
let middle = num / 2;
for (let i = 1; i <= middle; i++) {
let j = num - i;
let now = current.concat([i, j]);
results.push(now);
if (j > 1) {
// 繼續(xù)分解j
let next = current.concat([i]);
plus(j, next);
}
}
}
// 過濾掉相同的值
function filterSameValueArray(arr) {
arr = arr.map((item) => {
return item.sort().join(',');
});
return Array.from(new Set(arr))
.map((item) => {
return item.split(',');
});
}
plus(10);
// 按長度排序
results = results.sort( (a, b) => {
return a.length - b.length; // 負值代表誰應(yīng)該在前面
});
results = filterSameValueArray(results).map(item => {
return item.join(' + ');
});
console.log(`10的所有和的組成結(jié)果有${results.length}種,分別是:`);
console.log(results);
注意幾個點,關(guān)于數(shù)組的拷貝問題,concat
拼接新數(shù)組不會對原數(shù)組造成污染,這里僅限于其數(shù)組元素沒有對對象的引用。而splice()
會對原數(shù)組造成污染,倘若數(shù)組元素里面有對對象的引用的話,就要采用深拷貝等操作了。在這里,對于數(shù)組的過濾,我們可以巧妙地使用字符串比較的方法來判斷數(shù)組元素是否相等,前提是數(shù)組元素需要實現(xiàn)排好序。
如果以上有什么錯誤,歡迎輕拍。
哎,好吧。Mask
同學(xué)看出了問題,的確,那天寫答案已經(jīng)很晚就沒有做去重。還是被人發(fā)現(xiàn)了。。。?
現(xiàn)在補上。
const num = 10
const statck = []
const obj = {}
const pow = num => num ** num
function reduce(upper, before = []) {
for (let i = 1; i <= upper / 2; i++) {
const diff = upper - i
const arr = [i, diff, ...before]
const id = arr.map(pow).reduce((pre, cur) => pre + cur)
if (!obj[id]) {
statck.push(arr)
obj[id] = 1
}
if (diff > 1) reduce(diff, [...before, i])
}
}
reduce(num)
const result = statck.map(a => '10 = ' + a.join(' + '))
console.log(result)
一共41
種。
我現(xiàn)在想到的最快的方法應(yīng)該是找到Z=1+2+3+...+X。。然后把1,2,3,...,X,做一個遍歷和的組合,去掉有重復(fù)數(shù)字的,就應(yīng)該是你想要的答案了。。比如10=1+2+3+4。。然后你就找到1,2,3,4的遍歷和的組合。。
1. 1,2=3 3+4+3 (重復(fù)數(shù)字)
2. 1,3=4 2+4+4 (重復(fù)數(shù)字)
3. 1,4=5 2+3+5
4. 1,2,3=6 4+6
5. 1,2,4=7 3+7
6. 1,3,4=8 2+8
8. 2,3=5 1+4+5
9. 2,4=6 1+3+6
10. 2,3,4=9 1+9
.
.
.
這樣子的形式。。
北大青鳥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)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(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)師。