从后往前选取,选定位置i后,再在前i-1个里面选取m-1个。
如 1 2 3 4 5 中选取 3 个
1、选取5后,再在前4个里面选取2个,而前4个里面选取2个又是一个子问题,递归即可。
2、如果不包含5,直接选定4,那么再在前3个里面选取2个,而前三个里面选取2个又是一个子问题,递归即可。
3、如果也不包含4,直接选取3,那么再在前2个里面选取2个,刚好只有两个。
纵向看,1、2、3刚好是一个for循环,初值为5,终值为m
横向看,该问题为一个前i-1个中选m-1的递归。
@property (nonatomic, strong)NSMutableArray *dataArray; //源数组
@property (nonatomic, strong)NSMutableArray *tempArray;//过度数组
@property (nonatomic, strong)NSMutableArray *resultArray;//结果数组s
_dataArray = [[NSMutableArray alloc]init];
[_dataArray setArray:@[@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9"]];
_resultArray = [[NSMutableArray alloc]init];
_tempArray = [[NSMutableArray alloc]initWithCapacity:4];
[_tempArray setArray:@[@"0",@"0",@"0",@"0"]];
[self newCaculateSort];
- (void)newCaculateSort{
[self combination:9 in:4];
}
- (void)combination:(int)n in:(int)m{
if (m == 0) {
[_resultArray addObject:[NSArray arrayWithArray:_tempArray]];
return;
}
for (int i = n; i >= m ; --i) {
[_tempArray replaceObjectAtIndex:m-1 withObject:[_dataArray objectAtIndex:i-1]];
[self combination:i-1 in:m-1];
}
}