Как упростить дерево вложенных операторов if - PullRequest
1 голос
/ 04 апреля 2019

У меня есть вложенное дерево операторов if, которое выполняет функцию 16 раз (я знаю), каждый раз отправляя в функцию различный набор элементов.

Функция просто возвращает истину или ложь.

if(!checkSpecial(1,1,1,1)) {
    if(!checkSpecial(1,1,1,0)) {
        if(!checkSpecial(1,1,0,1)) {
            if(!checkSpecial(1,0,1,1)) {
                if(!checkSpecial(0,1,1,1)) {                                
                    if(!checkSpecial(1,1,0,0)) {                            
                        if(!checkSpecial(1,0,0,1)) {                            
                            if(!checkSpecial(0,0,1,1)) {                            
                                if(!checkSpecial(1,0,1,0)) {                            
                                    if(!checkSpecial(0,1,0,1)) {                            
                                        if(!checkSpecial(0,1,1,0)) {                    
                                            if(!checkSpecial(1,0,0,0)) {                    
                                                if(!checkSpecial(0,1,0,0)) {                    
                                                    if(!checkSpecial(0,0,1,0)) {                    
                                                        if(!checkSpecial(0,0,0,1)) {                    
                                                            if(!checkSpecial(0,0,0,0)) {
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }   
} else {
    // do other stuff
}

Как вы можете видеть, если функция возвращает false в каждом из этих экземпляров, я хочу делать другие вещи.

Я не хочу ничего делать, если функция возвращаетtrue.

Мой вопрос: я знаю, что должен быть лучший способ сделать это, я предполагаю, через какой-то цикл, но я не знаю, как будет называться этот тип циклаили как это будет работать.

Мое решение на данный момент:

for (var i = 0; i < 16; i++) { 
   // HELP!
}

Любые указатели будут оценены.спасибо.

Ответы [ 4 ]

1 голос
/ 04 апреля 2019

Вы можете создать массив двоичного представления чисел 0-15, а затем проверить, если every один из них возвращает false при вызове функции с элементами массива в качестве аргументов:

const combinations = Array.from(
  { length: 16 },
  (_, i) => (i >>> 0).toString(2).padStart(4, '0').split('').map(Number)
);

console.log(combinations)
/*
if (combinations.every(combination => checkSpecial(...combination) === false)) {
  // every result was false
} else {
  // at least one result wasn't false
}
*/
0 голосов
/ 04 апреля 2019
function* bin(){
  yield 0;
  yield 1;
}
function* word(size,prefix){
  if(!prefix){
    prefix=[];
  }
  if(size){
    var b=bin(),
        n;
    while((n=b.next()) && !n.done){
      prefix[size-1]=n.value;
      yield* word(size-1,prefix);
    }
  } else {
    yield prefix;
  }
}

var w=word(4),
    cond=true,
    n;
while((n=w.next())&&!n.done){
  if(checkSpecial.apply(n.value)){
    cond=false;
    break;
  }
}

if(cond){

} else {

}
0 голосов
/ 04 апреля 2019

Вот идея с циклом for.Подключите это к вашему VS

     int a = 0;
     int b = 0;
     int c = 0;
     int d = 0;


     for (a = 0; a <= 1; a++)
     {
        for (b = 0; b <= 1; b++)
        {
           for (c = 0; c <= 1; c++)
           {
              for (d = 0; d <= 1; d++)
              {
                 Console.WriteLine($"function({a}, {b}, {c}, {d})");
              }
           }
        }
     }
     Console.ReadKey(); 
0 голосов
/ 04 апреля 2019

Мое единственное предложение следующее:

  1. Инициализировать массив с каждой перестановкой

var permutations = [
	[0, 1, 1, 0],
  [1, 1, 1, 0]
];
Перебирайте эти перестановки и делайте то, что вам нужно

permutations.forEach(function(permutation) {
    if (checkSpecial(permutation[0], permutation[1], permutation[2], permutation[3])) {

    } else {

    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...