|
0 / 0 / 0
Регистрация: 25.06.2017
Сообщений: 8
|
||||||
Как реализовать рекурсией n вложенных циклов с определенным условием?20.07.2021, 08:29. Показов 2918. Ответов 4
Здравствуйте! Не получается реализовать рекурсию для n вложенных циклов. Помогите пожалуйста, если это вообще возможно реализовать.
0
|
||||||
| 20.07.2021, 08:29 | |
|
Ответы с готовыми решениями:
4
Как выходить из нескольких вложенных циклов? Как сделать n количество вложенных циклов for Как найти максимальное количество вложенных циклов в C#? |
|
0 / 0 / 0
Регистрация: 25.06.2017
Сообщений: 8
|
||||||
| 23.07.2021, 19:36 [ТС] | ||||||
|
Выше небольшие опечатки в индексах. У меня так и не получилось сделать рекурсию, поэтому написал "в лоб" варианты от 2 до 120 вложенных циклов. Код получился ужасный. И ограничение в 127 циклов и условий не дают сделать больше.
Вообще это перебор для целевой функции и ограничений. Но, если в классическом переборе переменные умножаются на булевой вектор, то в этом случае мы делим набор переменных на n частей (ModuleArray). Например: система вида 7z1+5z2+6z3+1z4->max 6z1+9z2+4z3+1z4<=10 вместо zn мы перебираем {0,0,0,0},{0,0,0,1},{0,0,1,0} и так далее до нахождения наилучшего ответа. А в моем варианте мы разбиваем, например, на 2 модуля, затем находим их суммы и ограничения, все забиваем в массив структуры ModuleArray для каждого модуля: F-суммы, L-ограничения, vector- вектор всех вариантов, variableNumber- количество переменных в модуле (в данном случае по 2 в каждой). Как выглядит первый модуль: vector={0,0};{0,1};{1;0};{1;1} F=0;5;7;12 L=0;9;6;15 variableNumber=2; (всего вариантов перебора 2^2 получается) Второй модуль: vector={0,0};{0,1};{1;0};{1;1} F=0;1;6;7 L=0;1;4;5 variableNumber=2; Когда все забито, переходим к коду, который я привел. Для каждого набора z перебираем все возможные варианты. При этом складывая соответствующие суммы F между собой, получается sum. Если sum меньше либо равно, чем было, пропускаем этот вариант, а если больше, то проверяем сумму ограничений limit(ограничений может быть больше, чем одно). Если все в порядке, то запоминаем ответ. Если переменных много, и мы разделили на множество модулей, то может понадобится множество циклов. Я написал 127 вариантов для каждого количества модулей, больше нельзя потому что с++ не разрешает больше циклов. Поэтому думал, что можно как-то сделать более универсальное решение благодаря рекурсии, тогда можно делить на большее количество модулей и будет больше циклов и кода меньше ( сейчас варианты от 2 до 120 занимают 55 тысяч строк.
0
|
||||||
|
0 / 0 / 0
Регистрация: 25.06.2017
Сообщений: 8
|
|
| 24.07.2021, 03:25 [ТС] | |
|
Я не могу понять как присвоить sum=moduleArray[0].F[i1]+moduleArray[1].F[i2]+moduleArray[2].F[i3]; в рекурсии. То же самое обстоит и с limit[j1]=moduleArray[0].L[i1][j1-1]+moduleArray[1].L[i2][j1-1]+moduleArray[2].L[i3][j1-1]; Это возможно?
0
|
|
|
|
|
| 24.07.2021, 21:31 | |
|
мне не нравится это читать.
Почему так много букв? почему всё в одной функции навалено? почему двойка возводится в степень не оператором сдвига? почему некоторые строки написаны по несколько выражений в одной строчке? почему conditionalMatrix это не двумерный массив? зачем всё так сложно в простой задаче (хоть я и не знаю условия)?
0
|
|
|
0 / 0 / 0
Регистрация: 25.06.2017
Сообщений: 8
|
||||||
| 24.07.2021, 22:44 [ТС] | ||||||
|
Потому что это не идеальный код) А решение я нашел сам:
Использовал в рекурсии цикл while вместо for и завел массив i размером с число циклов и в нем хранил уже перебираемые переменные.
0
|
||||||
| 24.07.2021, 22:44 | |
|
Помогаю со студенческими работами здесь
5
Как сделать неизвестное количество вложенных циклов? Использование циклов с параметром и циклов с условием
Как посчитать количество строк двумерного массива с определенным условием Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|