iOS之递归算法

递归是编程语言中一种较为常见的算法,一个函数直接间接调用自身的一种方法。当调用一次函数可能解决不了当前的问题和需求,需要重复调用,一直到达成目的。
常见用法:
(1)对数组降维,把数组降成一维

    @interface ViewController ()
    @property(nonatomic,strong)NSMutableArray *tmpArray;
    @end 

    #pragma mark -- 递归
    -(NSMutableArray *)outputArray:(NSArray *)mutArray
    {
        
        for (int i = 0;i< mutArray.count ; i++) {
            if ([mutArray[i] isKindOfClass:[NSArray class]]) {
                [self outputArray:mutArray[i]];
            }else{
                NSLog(@"");
                [_tmpArray addObject:mutArray[i]];
            }
        }
        return _tmpArray;
    }


    - (void)viewDidLoad {
    [super viewDidLoad];
        _tmpArray =[[NSMutableArray alloc]init];
        NSArray *testArray = @[@"2",@3,@[@"re",@"fd"],@[@"rr",@"ll",@[@[@8,@"fd"],@"jj"]]];

                    NSMutableArray *resultArray = [self outputArray:testArray];
         NSLog(@"%@",resultArray);
       
   
    }
       
   2020-11-04 18:41:22.700030+0800 id[919:24985] (
            2,
            3,
            re,
            fd,
            rr,
            ll,
            8,
            fd,
            jj
      )

(2)取多层数组中最里面一层的数据

  /// 取出来fatherTagList中tagList为空的weight值。
           let fatherTagList = [
               [
                   "weight": 0,
                   "tagList": [],
               ],
               [
                   "weight": 1,
                   "tagList": [["weight": 2,"tagList": []]]
               ],
               [
                   "weight": 3,
                   "tagList": [["weight": 4,"tagList": [["weight": 5,"tagList": []]]]]
               ],
           ]
           
           print(recursiveFunc(array: fatherTagList))
           //[0, 2, 5]
        func recursiveFunc(array: Array<Any>) -> Array<Any> {
        
        for (_, value) in array.enumerated() {
            
            let valueTemp = value as? [String: Any] ?? [:]
            let tagList = valueTemp["tagList"] as? Array<Any> ?? []
            
            if tagList.count == 0 {
                if let weight = valueTemp["weight"] as? Int {
                    resultArray.append(weight)
                }
            } else {
                recursiveFunc(array: tagList)
            }
        }
        return resultArray
    }

(3)算法之快排

     - (void)quickSortArray:(NSMutableArray *)array  withLeftIndex:(NSInteger)leftIndex andRightIndex:(NSInteger)rightIndex
{
    
//    NSLog(@"%@---%d---%d",array,leftIndex,rightIndex);
    
    if (leftIndex >= rightIndex) {//如果数组长度为0或1时返回
        return ;
    }
    
    NSInteger i = leftIndex;
    NSInteger j = rightIndex;
    //记录比较基准数
    NSInteger key = [array[i] integerValue];
    
    while (i < j) {
        /**** 首先从右边j开始查找比基准数小的值 ***/
        while (i < j && [array[j] integerValue] >= key) {//如果比基准数大,继续查找
            j--;
        }
        //如果比基准数小,则将查找到的小值调换到i的位置
        array[i] = array[j];
        
        /**** 当在右边查找到一个比基准数小的值时,就从i开始往后找比基准数大的值 ***/
        while (i < j && [array[i] integerValue] <= key) {//如果比基准数小,继续查找
            i++;
        }
        //如果比基准数大,则将查找到的大值调换到j的位置
        array[j] = array[i];
        
    }
    
    //将基准数放到正确位置
    array[i] = @(key);
    
    /**** 递归排序 ***/
    //排序基准数左边的
    NSLog(@"before--left%d---%d",i,rightIndex);

    [self quickSortArray:array withLeftIndex:leftIndex andRightIndex:i - 1];
    //排序基准数右边的
    NSLog(@"afterleft---%d---%d",i,rightIndex);

    [self quickSortArray:array withLeftIndex:i + 1 andRightIndex:rightIndex];
}

(4)二叉树的创建:

      class func createBinaryTree(value:Int , treeModel:BinaryTree) {

    if treeModel.value <= 0 {

        treeModel.value = value

        return
    }

    let midValue = treeModel.value

    if value < midValue {

        if (treeModel.leftTree == nil){

            treeModel.leftTree = BinaryTree()

            treeModel.leftTree?.value = value

            return

        }else{

            createBinaryTree(value: value, treeModel: treeModel.leftTree!)
        }

    }else{

        if (treeModel.rightTree == nil){

            treeModel.rightTree = BinaryTree()

            treeModel.rightTree?.value = value

            return

        }else{

            createBinaryTree(value: value, treeModel: treeModel.rightTree!)
        }
    }
}

(5)面试题之递归
题目:10块钱买5瓶酒,2个瓶盖换一瓶,4个酒瓶换一瓶。问10块钱能买多少瓶酒?
递归算法解决

  /**
*  计算酒瓶数
*  @param beer 啤酒数
*  @param bottleCaps 瓶盖数
*  @param bottle 瓶子数
*/
- (void)calculateBeerWithBeer:(int)beer bottleCaps:(int)bottleCaps bottle:(int)bottle{
   NSLog(@"第%d次的啤酒数:%d,瓶盖数:%d,瓶子数:%d",self.i,beer,bottleCaps,bottle);
   /** 不管什么,反正瓶盖和瓶子等于啤酒(可能有换不完的) */
   bottle += beer;
   bottleCaps += beer;
   /** 换完瓶盖和瓶子之后的啤酒数,瓶盖数,瓶子数 */
   beer = bottleCaps / 2 + bottle / 4;
   bottleCaps = bottleCaps % 2;
   bottle = bottle % 4;
   NSLog(@"最后一共喝了:%d瓶啤酒",self.number += beer);
   if (beer == 0) return ;
   self.i ++;
   [self calculateBeerWithBeer:beer bottleCaps:bottleCaps bottle:bottle];
}
   @interface ViewController ()
   @property (nonatomic ,assign) int i;
   @property (nonatomic ,assign) int number;

    @end
 - (void)viewDidLoad {
 [super viewDidLoad];

 self.i = 1;
 self.number = 5;
 [self calculateBeerWithBeer:5 bottleCaps:0 bottle:0];

// Do any additional setup after loading the view.
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容