В качестве продолжения моего вопроса здесь я пытаюсь реализовать следующую функцию PHP в Objective-C, которая будет генерировать декартово произведение:
function array_cartesian_product($arrays) { $result = array(); $arrays = array_values($arrays); $sizeIn = sizeof($arrays); $size = $sizeIn > 0 ? 1 : 0; foreach ($arrays as $array) $size = $size * sizeof($array); for ($i = 0; $i < $size; $i ++) { $result[$i] = array(); for ($j = 0; $j < $sizeIn; $j ++) array_push($result[$i], current($arrays[$j])); for ($j = ($sizeIn -1); $j >= 0; $j --) { if (next($arrays[$j])) break; elseif (isset ($arrays[$j])) reset($arrays[$j]); } } return $result; }
Вот что я имею до сих пор:
-(NSArray *) array_cartesian_product:(NSArray *)arrays { NSMutableArray *result = [[NSMutableArray alloc] init]; int sizeIn = [arrays count]; int size = (sizeIn > 0) ? 1 : 0; for(id array in arrays) size *= [array count]; for(int i = 0; i < size; i++) { for (int j = 0; j < sizeIn; j++) { [result insertObject:[arrays objectAtIndex:j] atIndex:i]; } for (int j = (sizeIn - 1); j >= 0; j--) { // ????? } } return result; }
Я теряюсь при попытке закодировать эквивалент функций next
, current
и reset
PHP, поскольку я не знаю, как ссылаться на внутренний указатель на массив.
Как я могу реализовать последний блок кода и получить эквивалентную функцию?
NSArray *cartesianProductOfArrays(NSArray *arrays) { int arraysCount = arrays.count; unsigned long resultSize = 1; for (NSArray *array in arrays) resultSize *= array.count; NSMutableArray *product = [NSMutableArray arrayWithCapacity:resultSize]; for (unsigned long i = 0; i < resultSize; ++i) { NSMutableArray *cross = [NSMutableArray arrayWithCapacity:arraysCount]; [product addObject:cross]; unsigned long n = i; for (NSArray *array in arrays) { [cross addObject:[array objectAtIndex:n % array.count]]; n /= array.count; } } return product; }
NSArray NSMutableArray не имеет следующих текущих функций сброса. Я думаю, вы можете написать класс для реализации такой функции
@interface myArray { NSMutableArray* array;//the real array int index;//hole the index } -(id)current; -(id)next; -(id)reset; @end
в@interface myArray { NSMutableArray* array;//the real array int index;//hole the index } -(id)current; -(id)next; -(id)reset; @end
функция 3 изменит индекс,