О, я не знаю, но во-первых, я создал combinations
и permutations
, а после некоторого времени я создал утилиту для вашей задачи.
var subsetTest:Array = [];
subsetFill([0, 1, 2], [], subsetTest, 2);
prettyPrint(subsetTest);
private function subsetFill(values:Array, cursor:Array, result:Array, length:uint):void {
if (cursor.length > length) {
return;
}
if (cursor.length == length) {
result.push(cursor.slice());
}
var i:uint, len:uint = values.length;
for (i; i < len; ++i) {
cursor.push(values[i]);
subsetFill(values, cursor.slice(), result, length);
cursor.length = cursor.length - 1;
}
}
//Auxiliary method for tracing
private function prettyPrint(list:Array):void {
var i:uint, len:uint = list.length;
for (i; i < len; ++i) {
trace(list[i]);
}
}
И результат:
[trace] 0,0
[trace] 0,1
[trace] 0,2
[trace] 1,0
[trace] 1,1
[trace] 1,2
[trace] 2,0
[trace] 2,1
[trace] 2,2
Если кто-то заинтересован, я мог бы поделиться combinations
и permutations
функции;)
Спасибо! xactly, что я хотел ... блестящий .. – jamie
Привет, есть ли способ сделать эту реализацию быстрее? Я бы хотел подняться до 10, но в этом случае он слишком вычислительно интенсивен. У меня есть способ сделать более эффективным, когда длина> необходима длина. Ваша помощь очень ценится! – jamie
10? Это много циклов и причин. Это очень интенсивно ... Если ваши данные недостаточно динамичны, вы можете прекомпретировать значение только один раз с предоставленным алгоритмом, или вы можете перенести этот алгоритм на [Рабочий] (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/Worker.html) –