Мой код работает отлично:
const i=['a','e','i','o','u'];
let q=[];
for(let t=0,l=i.length;t<l;++t)
{
for(let e=t+1,l=i.length;e<l;++e)
{
for(let z=e+1,l=i.length;z<l;++z)
{
q.push([i[z],i[e],i[t]]);
}
}
}
console.table(q);
Но моя цель — сделать внутренние циклы динамическими, чтобы я мог изменить количество внутренних циклов (3 в данном конкретном случае).
Например, если бы я хотел изменить внутренние циклы на 4, мне пришлось бы переписать код следующим образом:
const i=['a','e','i','o','u'];
let q=[];
for(let t=0,l=i.length;t<l;++t)
{
for(let e=t+1,l=i.length;e<l;++e)
{
for(let z=e+1,l=i.length;z<l;++z)
{
for(let c=z+1,l=i.length;c<l;++c)
{
q.push([i[c],i[z],i[e],i[t]]);
}
}
}
}
console.table(q);
Поэтому я хочу иметь возможность создавать внутренние циклы ДИНАМИЧЕСКИ по одной и той же формуле.
Очень большая проблема X/Y
@deceze Формула уже представлена здесь, и «Динамическое создание циклов» — это формула. Все, что мне нужно, — это иметь возможность динамически воссоздавать одну и ту же формулу вместо того, чтобы переписывать код для определенного количества циклов.
Это что-то похожее, но не совсем на декартово произведение нескольких массивов. Что можно решить без динамического создания циклов: stackoverflow.com/q/12303989/476
Вы начинаете с массива гласных (называемого i
). Можете ли вы описать словами, что вы пытаетесь получить из этого? Это поможет другим помочь вам найти подходящее решение вашей проблемы.
Здесь вы можете использовать рекурсию. Это означает, что у вас есть функция, которая занимается созданием подмассивов заданного размера, но опирается на следующее наблюдение:
Если мы можем выполнить эту работу для подмассивов, которые на один элемент короче заданного размера, то мы можем сделать это и для заданного размера: мы просто выполняем функцию для создания массивов, которые на один элемент короче, а затем добавляем к каждому элементу «текущий» элемент.
Вот рекурсивная реализация, которая выводит ту же таблицу, что и ваш пример:
function getSubarrays(arr, depth, take=0) {
if (depth <= 0) return [[]]; // One result: an empty subarray
depth--;
const subarrays = [];
for (let i = take; i < arr.length - depth; i++) {
for (const subarray of getSubarrays(arr, depth, i + 1)) {
subarrays.push([...subarray, arr[i]]);
}
}
return subarrays;
}
const arr = ['a','e','i','o','u'];
const results = getSubarrays(arr, 3);
// Output with console.info
for (const row of results) console.info(...row);
Таким образом, второй аргумент, присвоенный getSubarrays
, — это количество вложенных циклов, которые вы хотите выполнить. Этот аргумент уменьшается в рекурсии на один шаг за раз.
Огромное спасибо @trincot, это ****E-X-A-C-T-L-Y*** то, что я искал!!! 🙂
«Динамическое создание циклов» — неправильный подход; вы хотите найти алгоритм, который дает эквивалентный результат. Было бы полезно, если бы вы указали, что именно вы пытаетесь сделать.