03.08.2011, 20:49
|
Аспирант
|
|
Регистрация: 07.02.2009
Сообщений: 80
|
|
перебор всех возможных значений
есть табличка 3 на 5 в каждой ячейке возможно значение от 1 до 15, подскажите алгоритм для перебора всех возможных значений таблицы
|
|
04.08.2011, 02:27
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
Накидал пример (там с 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 );
Конечно, браузер сдохнет столько вариантов считать, но алгоритм - рабочий)
Последний раз редактировалось Sweet, 04.08.2011 в 13:37.
Причина: Подправил на свежую голову)
|
|
04.08.2011, 13:11
|
Профессор
|
|
Регистрация: 01.02.2010
Сообщений: 364
|
|
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] );
Последний раз редактировалось nikita.mmf, 04.08.2011 в 13:16.
|
|
04.08.2011, 14:25
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
Вот еще вариант с передачей матрицы, образующей формат данных:
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 ]);
*/
|
|
|
|