перебор всех возможных значений
есть табличка 3 на 5 в каждой ячейке возможно значение от 1 до 15, подскажите алгоритм для перебора всех возможных значений таблицы
|
Накидал пример (там с forEach, но при желании можно переписать):
function f(length, from, to){ return getResult( --length, from, to, getArray( from, to ) ); function getResult(length, from, to, result){ var newResult = []; getArray( from, to ).forEach(function(x){ result.forEach(function(y){ newResult.push( x.concat( y ) ); }); }); if( --length > 0 ) return getResult(length, from, to, newResult); return newResult; }; function getArray(from, to){ for(var array = []; from <= to; from++) array.push([ from ]); return array; }; }; alert( f( 3, 4, 5 ).join("\n") ); // Твой вариант f( 15, 1, 15 ); Конечно, браузер сдохнет столько вариантов считать, но алгоритм - рабочий) |
function getAllCombination ( list ) { var len = list.length, binaryList = Array(len+1).join(0).split(''); var result = [], pos, resultStep; while ( true ) { pos = 0; resultStep = []; while ( binaryList[ pos ] ) { binaryList[ pos ] = 0; pos++; } if ( pos == len ) { break; } binaryList[ pos ] = 1; for ( var j = len; j--; ) { if ( binaryList[j] ) { resultStep[ resultStep.length ] = list[j]; } } result[ result.length ] = resultStep.sort(); } return result; } getAllCombination( [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] ); |
Вот еще вариант с передачей матрицы, образующей формат данных:
function combinator(matrix){ return matrix.reduceRight(function(combination, x){ var result = []; x.forEach(function(a){ combination.forEach(function(b){ result.push( [ a ].concat( b ) ); }); }); return result; }); }; alert( combinator([ [ 1, 3 ], [ "a", "b"], [ 2, 4, ] ] ).join("\n") ); /* А это, чтобы получить все варианты авто-номеров: var digits = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ], letters = [ "A", "B", "C", "E", "H", "K", "M", "O", "P", "T", "X", "Y" ]; combinator([ letters, digits, digits, digits, letters, letters ]); */ |
Часовой пояс GMT +3, время: 17:28. |