Денис, чет не нашел исходника на С, давно это делал, попробую изложить идею.
Пусть задано N.
В цикле от к = 1 до к < N делаем маску m = (2**к - 1)
Во вложенном цикле j = 0 до (N-к) маску шифтуем влево на j битов и складываем в текущий элемент массива.
Т.е. сначала 1 прогоняем по всем позициям, затем 3 (11), затем 7(111) и т.д.
Точно не помню, по-моему 0 и последнее число из N битов отдельно заполнял.
Примерно так.
Здравствуйте математики и программисты.
Вопрос конечно детский, но что-то не хочется голову ломать лишний раз. Тем более, наверняка уже есть проверенное, академическое решение...
Требуется перебрать циклом все варианты "переключателей" логического массива.
Скажем есть массив
bool Array[3];
вариантов включения\выключения его элементов 8, если не ошибаюсь.
вот они:
000
100
010
001
110
101
011
111
у массива Array[4] их уже 16, и т.д...
Так вот нужна функция нахождения всех вариантов массива произвольного размера.
Известна вам такая?
Спасибо.
:) Мне всегда нравились абстракции - произвольног это какого? 10 в 100-ой?
Ничего сложного в этом нет, единственное подскажу кое-что, тогда Вы и сами поймёте как это легко сделать...
Во-первых у Вас не корректная немного таблица возможных значений, составлять её нужно так:
значений в столбце(кол-во строк) равно 2^n где n - это количество значений в комбинации, рамерность массива в Вашем случае
есть период, который немного завуалирован, при движении по столбцам период домножается на 2, изначально период равен 1
int period_=1,count; bool comb=false; bool array[5][32]; string comm=""; for(i=0;i<5;i++) { for(int j=0;j<MathPow(2,5);j++) { array[i][j] = comb; count++; if(count+1>period_){comb=!comb;count=0;} } period_*=2; comb=false; count=0; } for(j=0;j<MathPow(2,5);j++) { for(i=0;i<5;i++) comm=comm+array[i][j]+" "; Print(comm); comm=""; }
не успел немного... но всёравно уже выложу...
вобщем на 3 столбцах получается так:
000
100
010
110
001
101
011
111
да, здесь полезно вспомнить "одно маленькое исследование"... https://www.mql5.com/ru/forum/121742
Денис, чет не нашел исходника на С, давно это делал, попробую изложить идею.
Пусть задано N.
В цикле от к = 1 до к < N делаем маску m = (2**к - 1)
Во вложенном цикле j = 0 до (N-к) маску шифтуем влево на j битов и складываем в текущий элемент массива.
Т.е. сначала 1 прогоняем по всем позициям, затем 3 (11), затем 7(111) и т.д.
Точно не помню, по-моему 0 и последнее число из N битов отдельно заполнял.
Примерно так.
Ничего сложного в этом нет, единственное подскажу кое-что, тогда Вы и сами поймёте как это легко сделать...
Во-первых у Вас не корректная немного таблица возможных значений, составлять её нужно так:
значений в столбце(кол-во строк) равно 2^n где n - это количество значений в комбинации, рамерность массива в Вашем случае
есть период, который немного завуалирован, при движении по столбцам период домножается на 2, изначально период равен 1
не успел немного... но всёравно уже выложу...
вобщем на 3 столбцах получается так:
000
100
010
110
001
101
011
111
Спасибо! Идея с двоичными значениями понятна.
А вот если развить тему, это домножение периода на 2 годится, видимо, именно для бинаров.
А если речь пойдет о большем количестве значений в каждой ячейке, то понадобится более многомерные массивы или как?...
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте математики и программисты.
Вопрос конечно детский, но что-то не хочется голову ломать лишний раз. Тем более, наверняка уже есть проверенное, академическое решение...
Требуется перебрать циклом все варианты "переключателей" логического массива.
Скажем есть массив
bool Array[3];
вариантов включения\выключения его элементов 8, если не ошибаюсь.
вот они:
000
100
010
001
110
101
011
111
у массива Array[4] их уже 16, и т.д...
Так вот нужна функция нахождения всех вариантов массива произвольного размера.
Известна вам такая?
Спасибо.