Heim > Fragen und Antworten > Hauptteil
Ich habe heute ein Problem bei der Implementierung eines Algorithmus mit js festgestellt. Wie kann ich bei gegebener Funktion und Verschachtelungstiefe (int-Typ) eine verschachtelte Struktur zurückgeben?
Gegebene Parameter: fn, deepLength
Rückgabestruktur (nehmen Sie als Beispiel deepLength=3):
for (var x = 0; x <= 9; x++) {
for (var y = 0; y <= 9; y++) {
for (var z = 0; z <= 9; z++) {
rs = fn([x,y,z])
}
}
}
Nachdem ich eine Weile darüber nachgedacht habe, scheint es, dass dies nur durch verschachtelte Funktionen erreicht werden kann. Gibt es eine elegantere Implementierungsmethode?
Ich habe alle Methoden zusammengefasst und sie als Referenz auf eine Demoseite gestellt
Angehängter Link zur Interviewfrage: Kekse teilen
大家讲道理2017-05-19 10:45:39
function loop(fn, n, args = []) {
if (n === 0) {
fn.apply(null, args);
return;
}
for (let i = 0; i <= 9; i++) {
loop(fn, n - 1, args.concat(i));
}
}
loop((...args) => {
console.log(args);
}, 3);
仅有的幸福2017-05-19 10:45:39
使用构建字符串的方式实现了,但感觉太不优雅了。。
var deep = (fn, deeplen) =>{
var rs = null;
var args = [];
var content = 'var trueArgs = [];for(var i =0;i<args.length;i++){trueArgs[i]=eval(args[i])}rs = fn(trueArgs);';
for (var i = 0; i < deeplen; i++) {
args.push(`iter${i}`);
content = `for ( var iter${i} = 0; iter${i}<=9; iter${i}++){ ${content} }`;
}
new Function('fn', 'args', content)(fn, args);
return rs;
}
面试题参考代码
大家讲道理2017-05-19 10:45:39
let loop = (fn, layer) => {
return (arr) => {
for (let i = 0; i <= 9; i++) {
arr[layer] = i
fn(arr)
}
}
}
let nestedLoop = (fn, deepLength) => {
for (let i = deepLength; i > 0; i--) {
fn = loop(fn, i - 1)
}
fn ([])
}
nestedLoop((arr) => console.log(arr.join('')), 3)