2016-08-07 2 views
0

Рассмотрим следующий вопрос множественного выбора:Как рассчитать все возможные комбинации множественного выбора?

Что цвет яблок?

  • a. красный
  • б. зеленый
  • c. синий
  • d. черный

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

a 
b 
c 
d 
a, b 
a, c 
a, d 
b, c 
b, d 
c, d 
a, b, c 
a, b, d 
a, c, d 
b, c, d 
a, b, c, d 

... но это склонное к человеческой ошибке. Как я могу сделать это с помощью JavaScript?

Моя первая мысль, чтобы определить общее число вариантов (а, б, в, г = 4) ...:

const TOTAL_CHOICES = 4; 

// TO-DO 

... но тогда я не знаю, что следующий шаг должен быть. Есть идеи?

+0

Поиск «перестановок и комбинаций» даст вам всю информацию о фоновом режиме, необходимую для вычисления возможных комбинаций ответов. Некоторые калькуляторы имеют кнопку nCr/nPr - для решения только таких проблем. – enhzflep

+2

Взгляните на http://codereview.stackexchange.com/questions/7001/generating-all-combinations-of-an-array, вы можете получить https://jsfiddle.net/Lg0wyt9u/1101/ –

+0

Math.Pow (2, NUMCHOICES) дает вам количество вариантов, предполагая, что «ни один из вышеперечисленных» не является возможным. Если должен быть хотя бы один выбор, вычтите из него 1. –

ответ

0

С помощью комментария @ Ненад-Врачар, я нашел решение:

function combinations(str) { 
    var fn = function(active, rest, a) { 
    if (!active && !rest) 
     return; 
    if (!rest) { 
     a.push(active); 
    } else { 
     fn(active + rest[0], rest.slice(1), a); 
     fn(active, rest.slice(1), a); 
    } 
    return a; 
    } 
    return fn("", str, []); 
} 

var result = combinations('abcd').sort(); 

for (combination of result) { 
    document.body.innerHTML += combination + '<br>'; 
} 

Это будет выход:

a 
ab 
abc 
abcd 
abd 
ac 
acd 
ad 
b 
bc 
bcd 
bd 
c 
cd 
d 
0

Это реализует способ, которым я предлагал в моем комментарии.

var choices = ['d','c','b','a']; 
var numCombos=Math.pow(2,choices.length); 
var binNum; 
writeln('Combos are:'); 
for (i=0;i<numCombos;i++) 
{ 
binNum=(i.toString(2)); 
while (binNum.length<choices.length) 
    binNum='0'+binNum; 
for (j=choices.length-1;j>=0;j--){ 
    if (binNum[j]=='1') write(choices[j]);} 
writeln(); 
} 
+0

Это работает в онлайн-бегуне, который я использовал, но вы можете добавить «документ». прежде чем писать и писать, чтобы сделать его более портативным. –

Смежные вопросы