我想要這個結果:
[[1,2],[1,3],[1,4,5,6],[1,4,5,7]]
來自以下一組物件:
var andsOrs =
Ands(items: [
single(1),
Ors(items: [
single(2),
single(3),
Ands(items: [
single(4),
single(5),
Ors(items: [
single(6),
single(7),
]),
]),
]),
]);
我正在努力撰寫一個可以產生輸出的函式,有人可以幫忙嗎?任何現代面向物件語言都可以,c#、js、dart、c 。
uj5u.com熱心網友回復:
如果我理解正確,你正在尋找一個名為功能Ands,Ors并single會得到期望的結果。所需結果的格式是一個二維陣列,其中內部陣列列出經過 AND 運算的原子值,外部陣列列出經過 OR 運算的項。
這些函式中的每一個都應該回傳該格式,也應該回傳single. 因此,例如,single(1)應該回傳[[1]]。
該Ors函式應該只是將它作為引數獲取的 2D 項連接到一個更長的 2D 陣列中。所以,如果舉例來說,Ors增加了兩個專案:[[1,2]]和[[3,4],[5,6]]則回傳值應該是[[1,2],[3,4],[5,6]]。
更復雜的是Ands:它應該對它得到的引數執行笛卡爾積。
這是 JavaScript 中的一個實作。輸入的符號有點不同,items: 因為函式引數將是無效的語法。我們可以將每個專案作為單獨的引數傳遞并使用擴展語法:
function single(i) {
return [[i]];
}
function Ands(first, ...rest) {
// Cartesian product, using recursion
if (!rest.length) return first;
let restResult = Ands(...rest);
let result = [];
for (let option of first) {
for (let restOption of restResult) {
result.push([...option, ...restOption]);
}
}
return result;
}
function Ors(...items) {
return items.flat(1); // Reduces 1 level of array depth (from 3 to 2)
// Alternative syntax to get the same result:
// return [].concat(...items)
}
var andsOrs =
Ands(
single(1),
Ors(
single(2),
single(3),
Ands(
single(4),
single(5),
Ors(
single(6),
single(7),
),
),
),
);
console.log(andsOrs);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/356394.html
