一
有些运算必须使用递归,所以这个问题在遇到的时候就真的是浪费时间的一个算法探究,上周加班就是解决这个递归算法,今天先简单说下。因为我也是刚做出一个递归的东西,对于算法大学是学过,但是毕竟一直没用过,所以难免还有很多不足。但是一个简单的递归在ios基本项目中还是可以解决的。
二
例如我有一个商品,这个商品有若干个规格,每个规格下,又有若干个属性。现在需要求这个商品有几种搭配方式,并且需要将每一种方式打印下来。
三
这里我举例,我的商品有颜色、重量、尺寸三种规格,颜色包括红、黄、蓝三种,重量有1kg、2kg两种,尺寸有31、32两种。然后我们如果搭配的话,
结果应该是(1)颜色:红,重量:1kg,尺寸:31(2)颜色:红,重量:1kg,尺寸:32(3)颜色:红,重量:2kg,尺寸:31(4)颜色:红,重量:2kg,尺寸:32(5)颜色:黄,重量:1kg,尺寸:31(6)颜色:黄,重量:1kg,尺寸:32(7)颜色:黄,重量:2kg,尺寸:31(8)颜色:黄,重量:2kg,尺寸:32(9)颜色:蓝,重量:1kg,尺寸:31(10)颜色:蓝,重量:1kg,尺寸:32(11)颜色:蓝,重量:2kg,尺寸:31(12)颜色:蓝,重量:2kg,尺寸:32这十二种,但是我要的结果是颜色:红,重量:1kg,尺寸:31;颜色:红,重量:1kg,尺寸:32········
四
之前没有运用递归的时候,无论你怎么使用for循环,都是得不到上面的结果的,网络上有很多递归算法,但是都是一些简单的从10个数的数组里面取出任意两个作为新的数组,最后能得到几组等。这些都是最基本的,我们的需求那么复杂这些简单的东西当然只是一个学习递归的思想,然后真正想运用的话,今天我这里用代码为大家做进一步的提高。
五
首先我需要一个原始数组大概是这样的,[颜色:[红,黄,蓝],重量:[1kg,2kg],尺寸:[31,32]]具体的json格式我就不写了,大家能看懂就行。其实就是数组里面套数组的常见格式。下面直接上代码,解释代码的注释在代码字里行间大家可以查看
#pragma mark-拼接参数方法
//这里是引入资源数组然后根据数组再拼接成需要的字符串,当然还需要传入一个上次拼接的结果字符串prefix
-(void)comparewithSoruce:(NSArray*)sourceArr withPrefix:(NSString*)prefix
{
//判断资源数组有几组规格,如果有一个就直接打印每一个对象就ok了,如果大于1那么就需要用到递归算法。
if (sourceArr.count==1) {
NSString *fenhaoStr;
NSDictionary *selectDic =sourceArr[0];
NSString *keyString = selectDic[@"name"];
NSArray *oneArray = selectDic[@"attrList"];
if (oneArray.count) {
for (NSInteger i=0; i<oneArray.count; i++) {
NSString *valueString = oneArray[i][@"name"];
if (prefix.length)
{
if (i)
fenhaoStr = [NSString stringWithFormat:@"%@;%@,%@:%@",fenhaoStr,prefix,keyString,valueString];
else
fenhaoStr = [NSString stringWithFormat:@"%@,%@:%@",prefix,keyString,valueString];
}
else
{
if (i)
fenhaoStr = [NSString stringWithFormat:@"%@;%@:%@",fenhaoStr,keyString,valueString];
else
fenhaoStr = [NSString stringWithFormat:@"%@:%@",keyString,valueString];
}
}
pinjieStr =[NSString stringWithFormat:@"%@;%@",pinjieStr,fenhaoStr];
}
else
{
if (prefix.length)
{
pinjieStr =[NSString stringWithFormat:@"%@;%@",pinjieStr,prefix];
}
}
}
else
{
if (sourceArr.count) {
[self compareWithOneArray:sourceArr WithPrefix:prefix];
}
}
}
//第N个array中只取一个key和value
-(NSString*)compareWithOneArray:(NSArray*)array WithPrefix:(NSString*)prefix
{
//这里就是递归算法的内部运算法则,即:删除一种规格,将上一种规格拼接在prefix后面形成新的字符串,然后循环当前规格下的数组,并拼接在字符串后面。
NSMutableArray *middleArray = [[NSMutableArray alloc]initWithArray:array];
[middleArray removeObjectAtIndex:0];
NSString *maohaoStr;
NSDictionary *dic=array[0];
NSString *keyString = dic[@"name"];
NSArray *oneArray = dic[@"attrList"];
if (oneArray.count) {
for (NSInteger i=0; i<oneArray.count; i++) {
NSString *valueString = oneArray[i][@"name"];
if (prefix.length) {
if (i)
{
maohaoStr = [NSString stringWithFormat:@"%@,%@:%@",prefix,keyString,valueString];
}
else
{
maohaoStr = [NSString stringWithFormat:@"%@,%@:%@",prefix,keyString,valueString];
}
}
else
{
if (i)
{
maohaoStr = [NSString stringWithFormat:@"%@:%@",keyString,valueString];
}
else
{
maohaoStr = [NSString stringWithFormat:@"%@:%@",keyString,valueString];
}
}
[self comparewithSoruce:middleArray withPrefix:maohaoStr];
}
}
else
{
if (prefix.length)
maohaoStr = [NSString stringWithFormat:@"%@",prefix];
else
maohaoStr = @"";
[self comparewithSoruce:middleArray withPrefix:maohaoStr];
}
return maohaoStr;
}
//将最后的格式修改下(因为,和;都是根据for循环添加的,最后生成的字符串肯定是不符合要求的,这里就需要将字符串开头和结尾处理一下就实现我们需要的结果字符串了)
-(NSString *)changeComparedStringToNeedStyle
{
if ([pinjieStr hasPrefix:@";"]) {
pinjieStr = [pinjieStr substringFromIndex:1];
pinjieStr =[NSString stringWithFormat:@"%@;",pinjieStr];
}
return pinjieStr;
}
递归运算暂时介绍到这里,如果还是不懂可以随时发私信,我会尽快在私信中回复大家的。