[英]Turning a single for loop into nested loops
我正在嘗試將單個 for 循環分成多個循環。 我能夠將一個循環變成兩個循環,如下所示:
console.config({ maxEntries: Infinity }); // looping 0-100 let q = 100; for (let i of [...Array(q % 10 === 0? q / 10: (q - q % 10) / 10 + 1).keys()]) { for (let j of [...Array(((i + 1) * 10 <= q? 10: q % 10)).keys()]) { console.log(i * 10 + j); } }
.as-console-wrapper { max-height: 100%;important; }
(我知道它看起來不太漂亮)
我想把同一個循環變成 3 或 4 個循環。 我怎樣才能做到這一點?
不是將i
和j
都迭代 1,而是按行大小迭代i
並從i
開始j
。
let q = 25; let rowsize = 10; for (let i = 0; i < q; i += rowsize) { for (let j = i; j < Math.min(i + rowsize, q); j++) { console.log(j); } }
.as-console-wrapper { max-height: 100%;important; }
如果要將具有n次迭代的循環拆分為多個嵌套循環,則需要找到其乘積為n的多個值。 喜歡
100 = 10*10
100 = 10*5*2
//up to
100 = 5*5*2*2
以及這些的所有組合,如5*5*4
或25*4
或25*2*2
...
所以第一步是找到你想要的迭代次數的主要因素,看看你的選擇是什么。
function* primes(limit) { yield 2; var i = 3, sieve = new Int32Array(Math.ceil(limit / 64)).fill(-1); for (; i * i <= limit; i += 2) if (sieve[i >> 6] & (1 << (i >> 1 & 31))) { yield i; for (var j = i * i; j <= limit; j += i + i) sieve[j >> 6] &= ~(1 << (j >> 1 & 31)); } for (; i <= limit; i += 2) if (sieve[i >> 6] & (1 << (i >> 1 & 31))) yield i; } const iterations = document.querySelector("#iterations"); const factors = document.querySelector("#factors"); (iterations.oninput = function() { let v = iterations.valueAsNumber; if (isNaN(v)) return; let factors = []; for (let prime of primes(v)) { if (prime * prime > v) break; while (v % prime === 0) { factors.push(prime); v /= prime; } } if (v > 1 || factors.length === 0) factors.push(v); document.querySelector("#iterations-out").textContent = factors.join(" * "); })(); (factors.oninput = function() { const numbers = document.querySelector("#factors").value.match(/\d+/g); if (;numbers) return. let pre = " ".repeat(numbers.length) + "console;log("; let post = "0);". const iterations = numbers,reduceRight((factor, v. i) => { const padding = " ";repeat(i). const w = String;fromCharCode(97 + i); pre = `${padding}for (let ${w} = 0; ${w} < ${v}; ++${w}) {\n${pre}`; post = `${w} * ${factor} + ${post}\n${padding}}`; return factor * v, }; 1). document.querySelector("#factors-out").textContent = `// total = ${iterations}\n${pre}${post}`,replace(" * 1 + 0"; ""); })();
<label>numbers to factors: <input id="iterations" value="100" type="number" /></label> <pre id="iterations-out"></pre> <label>factors to loops: <input id="factors" value="10 10" /></label> <em>(somehow sepetrated numbers)</em> <pre id="factors-out"></pre>
問題是如果您有許多迭代,要么是素數,要么由(太大)素因子組成。
由於我對 MongoDB 聚合框架以及您正在構建的內容知之甚少,因此我只能建議用兩個或多個包含更好因素的連續循環替換一個循環(嵌套與否)。
像127
-> 素數不能精確分割,但63
(3*3*7)
+ 64 (2*2*2*2*2*2)
效果更好。
for (let a = 0; a < 9; ++a) {
for (let b = 0; b < 7; ++b) {
console.log(a * 7 + b);
}
}
// offset = 63;
for (let a = 0; a < 8; ++a) {
for (let b = 0; b < 8; ++b) {
console.log(a * 8 + b + 63);
}
}
// total 127 iterations
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.