Динамическое создание внутренних циклов

Мой код работает отлично:

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);

Поэтому я хочу иметь возможность создавать внутренние циклы ДИНАМИЧЕСКИ по одной и той же формуле.

«Динамическое создание циклов» — неправильный подход; вы хотите найти алгоритм, который дает эквивалентный результат. Было бы полезно, если бы вы указали, что именно вы пытаетесь сделать.

deceze 29.06.2024 17:03

Очень большая проблема X/Y

mplungjan 29.06.2024 17:05

@deceze Формула уже представлена ​​здесь, и «Динамическое создание циклов» — это формула. Все, что мне нужно, — это иметь возможность динамически воссоздавать одну и ту же формулу вместо того, чтобы переписывать код для определенного количества циклов.

Hezi-Gangina 29.06.2024 17:06

Это что-то похожее, но не совсем на декартово произведение нескольких массивов. Что можно решить без динамического создания циклов: stackoverflow.com/q/12303989/476

deceze 29.06.2024 17:11

Вы начинаете с массива гласных (называемого i). Можете ли вы описать словами, что вы пытаетесь получить из этого? Это поможет другим помочь вам найти подходящее решение вашей проблемы.

ndc85430 29.06.2024 17:35
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
5
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь вы можете использовать рекурсию. Это означает, что у вас есть функция, которая занимается созданием подмассивов заданного размера, но опирается на следующее наблюдение:

Если мы можем выполнить эту работу для подмассивов, которые на один элемент короче заданного размера, то мы можем сделать это и для заданного размера: мы просто выполняем функцию для создания массивов, которые на один элемент короче, а затем добавляем к каждому элементу «текущий» элемент.

Вот рекурсивная реализация, которая выводит ту же таблицу, что и ваш пример:

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*** то, что я искал!!! 🙂

Hezi-Gangina 29.06.2024 21:53

Другие вопросы по теме