1 | ||||||
Множественные цикли13.06.2017, 17:09. Показов 1630. Ответов 14
Бывают простые ситуации, когда ты знаешь количество циклов, например, вот два цикла, один из которых вложен в другой:
Например, for (int i1=0;i1++;i1<n){ //делаем что-то for (int i2=0;i2++;i2<n) { //делаем что-то for (int i3=0;i3++;i3<n){ //делаем что-то .... for (int in=0;in++;in<n){ //делаем что-то }}...} Как запустить такую вещь в C++? Не могу же написать для компилятора три точки: ... Он меня не поймёт.
0
|
13.06.2017, 17:09 | |
Ответы с готовыми решениями:
14
цикли с++ цикли time в цикли while Lab4 цикли |
13.06.2017, 17:22 [ТС] | 3 |
А если 100 циклов? Я же не могу написать сто циклов.
А как написать рекурсию? Проблема в том, что вложенные циклы, то, что мы с ними делаем -- они влияют на другие циклы. Если тупо одно и то же запускать -- это не буде работать нормально. Идея в том, что работа каждого цикла будет немного отличаться: скажем, есть задача вывести на экран все перестановки чисел от 0 до 4 из 5. То есть вот первая перестановка: 0 1 2 3 4 Вот вторая 0 1 2 4 3 И так далее Если писать рекурсию, то есть запускать одну и ту же функцию много раз -- не будет работать. А если написать множественные циклы -- то задача легко решиться. Добавлено через 2 минуты Я уверен, что в C++ должен быть механизм написать n вложенных циклов. Какая-то библиотеке или что-нибудь ещё
0
|
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
|
|
13.06.2017, 17:27 | 5 |
В общем случае, как уже написали, решается рекурсией. В определёных - можно уменьшить "глубину" вызовов функций + возможно дополнитеные структуры данных для промежуточных результатов.
1
|
13.06.2017, 17:30 [ТС] | 6 | |||||
Я не знаю, как написать все перестановки с помощью рекурсии. Вот мой вариант без рекурсии, но рабочий вариант для 3 циклов, а если циклов будет 100? :
Вот содержание файла INPUT.TXT 4 3 0 3 2 1 8 0 6 5 1 2 0 4 5 6 7 0 1 2 3 4 У нас есть элементы: 1, 2, 3, 4 И программа выводит на экран все перестановки чисел от 1 до 4. Но я не знаю, как это написать с помощью рекурсии
Вот что выводит программа: 1 2 3 sum_min=15 1 2 4 1 3 2 sum_min=10 1 3 4 1 4 2 1 4 3 2 1 3 2 1 4 2 3 1 2 3 4 2 4 1 2 4 3 3 1 2 3 1 4 3 2 1 3 2 4 3 4 1 3 4 2 4 1 2 4 1 3 4 2 1 4 2 3 4 3 1 4 3 2
0
|
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
|
|
13.06.2017, 17:32 | 7 |
Есть алгоритм, в стандартной библиотеке С++ например: http://en.cppreference.com/w/c... ermutation .
1
|
13.06.2017, 17:34 [ТС] | 8 |
Я не хочу стандартный алгоритим, я хочу сам понять, как это написать с помощью рекурсии -- чтобы узнать язык C++ лучше.
Мне было бы интересно узнать, как это работает, как написать самому -- готовый алгоритм -- это важно, но хочется самому
0
|
13.06.2017, 17:38 | 9 | |||||
Ну вот навскидку тупо в лоб без оптимизаций (меняй n и наслаждайся):
1
|
Форумчанин
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
||||||
13.06.2017, 17:44 | 10 | |||||
1
|
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
|
|
13.06.2017, 17:50 | 11 |
1
|
Заблокирован
|
||||||
13.06.2017, 18:17 | 12 | |||||
GNU
1
|
19.06.2017, 23:31 [ТС] | 13 | |||||
Честно говоря, я всё равно не понял логику этой рекурсии: много-много вызовов функции, сложно понять логику работы, что там происходит. Однако я написал свой вариант: он более медленный, но рабочий: без рекурсии.
1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
0
|
Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
19.06.2017, 23:44 | 14 |
jvf, По поводу самой идеи множественных циклов хочу обратить твое внимание на смешанные системы счисления Грамотное их использование позволяет любое количество циклов уложить в два. Где-то на форуме я этот несложный фокус уже показывал. Найду - дам ссылку, но сам понимаешь, копать все свои посты - та еще работа...
А идея такая. Пусть у тебя вложенность - 3. Границы 4, 5, 6 (обработка матрицы A[4][5][6]) Представление числа от 0 до 4*5*6 - в системе счисления 4-5-6 дает индекс элемента этой матрицы. Возможно, это не совсем то, что тебе нужно, но попробуй обратить внимание на этот прием.
1
|
20.06.2017, 00:32 [ТС] | 15 |
Теперь мне надо написать более сложную программу: есть n чисел, берём из этих n чисел некое число k. Нужно написать все размещения из n по к.
Скажем, n=4, k=3 Тогда у нас будут другие числа: 1 2 3 1 2 4 1 3 4 и так далее. Попробую тоже самостоятельно это написать без готового алгоритма. Добавлено через 16 секунд Теперь мне надо написать более сложную программу: есть n чисел, берём из этих n чисел некое число k. Нужно написать все размещения из n по к. Скажем, n=4, k=3 Тогда у нас будут другие числа: 1 2 3 1 2 4 1 3 4 и так далее. Попробую тоже самостоятельно это написать без готового алгоритма. Добавлено через 1 минуту Из Википедии: В комбинаторике размещением (из n по k) называется упорядоченный набор из k различных элементов из некоторого множества различных n элементов. В отличие от сочетаний, размещения учитывают порядок следования предметов. Вот будет для меня интересная задача
0
|
20.06.2017, 00:32 | |
20.06.2017, 00:32 | |
Помогаю со студенческими работами здесь
15
Множественные ошибки в коде С++ printf, множественные аргументы Множественные условия выбора switch множественные ошибки в простом проэкте Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |