Скачать MetaTrader 5

Вопрос к программистам!!! Пожалуйста помогите решить простую задачу!

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Они уже зарабатывают с помощью Маркета. Зарабатывай и ты!
I_Alex_I
177
I_Alex_I 2016.09.24 02:18 
#define M_SIZE 20

struct sAAA{
   bool a[M_SIZE];
};

int FUN(sAAA &a[], int size){
   int i1,i2,i3,i4,i5,i6;
   int n=0;

   if (size==1){
      for (i1=0;i1<M_SIZE;i++){
         a[n].a[i1]=true;
         n++;
      }
      return(n);
   }

   if (size==2){
      for (i1=0;i1<M_SIZE-1;i1++){
         for (i2=i1+1;i2<M_SIZE;i2++){
            a[n].a[i1]=true;
            a[n].a[i2]=true;
            n++;
         }
      }
      return(n);
   }

   if (size==3){
      for (i1=0;i1<M_SIZE-2;i1++){
         for (i2=i1+1;i2<M_SIZE-1;i2++){
            for (i3=i2+1;i3<M_SIZE;i3++){
               a[n].a[i1]=true;
               a[n].a[i2]=true;
               a[n].a[i3]=true;
               n++;
            }
         }
      }
      return(n);
   }

   if (size==4){
      for (i1=0;i1<M_SIZE-3;i1++){
         for (i2=i1+1;i2<M_SIZE-2;i2++){
            for (i3=i2+1;i3<M_SIZE-1;i3++){
               for (i4=i3+1;i4<M_SIZE;i4++){
                  a[n].a[i1]=true;
                  a[n].a[i2]=true;
                  a[n].a[i3]=true;
                  a[n].a[i4]=true;
                  n++;
               }
            }
         }
      }
      return(n);
   }
   if (size==5){
      for (i1=0;i1<M_SIZE-4;i1++){
         for (i2=i1+1;i2<M_SIZE-3;i2++){
            for (i3=i2+1;i3<M_SIZE-2;i3++){
               for (i4=i3+1;i4<M_SIZE-1;i4++){
                  for (i5=i4+1;i5<M_SIZE;i5++){
                     a[n].a[i1]=true;
                     a[n].a[i2]=true;
                     a[n].a[i3]=true;
                     a[n].a[i4]=true;
                     a[n].a[i5]=true;
                     n++;
                  }
               }
            }
         }
      }
      return(n);
   }
   return(0);
}

Нужно решение этого алгоритма в виде рекурсии либо любой другой удобной реализации, без необходимости прописывать по двадцать вложенных циклов. size передаваемая в функцию, может быть любого значения от 1 до 20 или 30. (задает количество элементов которые обязательно должны быть активны(true) в структуре sAAA. каждый уникальный вариант добавляется в массив структур, как видно в коде). Прошу прощения за такую пустяковую задачу, но моя голова никак не робит в этом плане. Программирование лишь мое хобби. Заранее спасибо тому кто поможет решить.

PS: Элементы массива в структуре sAAA  по умолчанию инициализированы значениями false.

Vladimir Zubov
4323
Vladimir Zubov 2016.09.24 02:29  

Хотелось бы узнать изначальную задачу данного алгоритма, а не разбираться в коде.

Навскидку вижу, что будет тормозить, зная задачу возможно сделать более простым путём. 

I_Alex_I
177
I_Alex_I 2016.09.24 02:41  
Vladimir Zubov:

Хотелось бы узнать изначальную задачу данного алгоритма, а не разбираться в коде.

Навскидку вижу, что будет тормозить, зная задачу возможно сделать более простым путём. 

Это расчет в скрипте, тормоза не важны. алгоритм такой:

есть массив к примеру bool N[SIZE] . Каждый из его элементов инициализирован на false; Нужно перебрать все доступные сочетания. к примеру (0001\0010\0011\0100\0101\0110\0111 и так далее, только это вариант с 4 элементами) в коде в функцию передается значение size, которое задает обязательное количество одновременно активных значений. нужно перебрать все доступные варианты как в коде с примером вложенных циклов. точно знаю что это делается рекурсией, но как ее реализовать Бошка не варит )))

Все найденные варианты добавляются! Нужна именно такая реализация. Функция выполняет разовые промежуточные расчеты. в идеале прогнать переменную size с значения start до значения  end.

Dmitry Fedoseev
42920
Dmitry Fedoseev 2016.09.24 02:51  

Без рекурсии можно. 

Делаем массив. Массива, это как бы бы число, а элементы это биты. Дальше прибавляем к числу 1.

Был массив 000, прибавляем 1, получаем 001, прибавляем 1, получается 2, значит обнуляем и увеличиваем на 1 старший разряд, получаем 010, прибавляем 1, получаем 011, и т.д. 

Можно просто взять переменную инт, увеличивать ее на 1 и смотреть биты.

Если с правильного бока подойти, задача элэмэнтарная. 

I_Alex_I
177
I_Alex_I 2016.09.24 02:57  
Dmitry Fedoseev:

Без рекурсии можно. 

Делаем массив. Массива, это как бы бы число, а элементы это биты. Дальше прибавляем к числу 1.

Был массив 000, прибавляем 1, получаем 001, прибавляем 1, получается 2, значит обнуляем и увеличиваем на 1 старший разряд, получаем 010, прибавляем 1, получаем 011, и т.д. 

Можно просто взять переменную инт, увеличивать ее на 1 и смотреть биты.

Если с правильного бока подойти, задача элэмэнтарная. 

да я понимаю что элементарная, но как в коде реализовать, голову клинит. размер массива может быть 25 элементов. переменной инт не хватит. помогите с решением именно в коде.
Dmitry Fedoseev
42920
Dmitry Fedoseev 2016.09.24 03:21  
I_Alex_I:
да я понимаю что элементарная, но как в коде реализовать, голову клинит. размер массива может быть 25 элементов. переменной инт не хватит. помогите с решением именно в коде.
#define N 3

void OnStart(){
//---

   int z[N];
   ArrayInitialize(z,0);

   for(int i=0;i<MathPow(2,N);i++){
   
      string str="";
      for(int j=0;j<N;j++){
         str=str+""+z[j];
      }
      Alert(str);   
   
      for(int j=0;j<N;j++){
         z[j]++;
         if(z[j]==1){
            break;
         }
         else{
            z[j]=0;
         }
      }
  
   }
}
I_Alex_I
177
I_Alex_I 2016.09.24 03:31  
Dmitry Fedoseev:
Спасибо, сейчас проверю!
I_Alex_I
177
I_Alex_I 2016.09.24 03:41  
Dmitry Fedoseev:
Огромное спасибо! Именно это мне и было нужно!!! Просто Офигенно! Выйдет что толковое, обязательно поделюсь вознаграждением $$$!!!
Vladimir Zubov
4323
Vladimir Zubov 2016.09.24 04:18  
Здесь на форуме нехватает кнопки "лайк" )))
Alexey Volchanskiy
16679
Alexey Volchanskiy 2016.09.24 04:29  
Vladimir Zubov:
Здесь на форуме нехватает кнопки "лайк" )))
А я как-то давно поднимал этот вопрос в голосовании. Лень искать, по памяти большинство проголосовало против. Доводы были, что тогда логично ввести и дизлайк, но тогда начнется война. Тут и так сра**и случаются с завидной регулярностью и на пустом месте.
Alexey Viktorov
6905
Alexey Viktorov 2016.09.24 08:09  
Alexey Volchanskiy:
А я как-то давно поднимал этот вопрос в голосовании. Лень искать, по памяти большинство проголосовало против. Доводы были, что тогда логично ввести и дизлайк, но тогда начнется война. Тут и так сра**и случаются с завидной регулярностью и на пустом месте.

Я лично тоже категорически против всяческих лайков. А вот кнопку с элементарной благодарностью за предоставленный код или полезный совет нужна.

Вот наглядный пример, Дмитрий помог человеку, он ему высказал благодарность отдельным постом. Вроде-бы всё нормально. Но если кто-то прочитав этот код вдруг понимает что такой подход и ему пригодится, тоже писать отдельный пост? А если какой-либо совет будет полезен сотне пользователей? Будем читать сто постов в поиске следующего? Чтобы не доводить до "войн" не обязательно учитывать эти благодарности в репутацию и совсем не надо никаких способов выражения недовольства, или ещё чего похуже... Ну и список поблагодаривших можно (даже наверное лучше) скрывать под спойлером, желающие откроют и посмотрят кто благодарил.

1234
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий