iOS之遞歸算法

遞歸是編程語言中一種較為常見的算法,一個函數(shù)直接間接調(diào)用自身的一種方法俊马。當(dāng)調(diào)用一次函數(shù)可能解決不了當(dāng)前的問題和需求兵怯,需要重復(fù)調(diào)用纵竖,一直到達(dá)成目的兔朦。
常見用法:
(1)對數(shù)組降維,把數(shù)組降成一維

    @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)取多層數(shù)組中最里面一層的數(shù)據(jù)

  /// 取出來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) {//如果數(shù)組長度為0或1時(shí)返回
        return ;
    }
    
    NSInteger i = leftIndex;
    NSInteger j = rightIndex;
    //記錄比較基準(zhǔn)數(shù)
    NSInteger key = [array[i] integerValue];
    
    while (i < j) {
        /**** 首先從右邊j開始查找比基準(zhǔn)數(shù)小的值 ***/
        while (i < j && [array[j] integerValue] >= key) {//如果比基準(zhǔn)數(shù)大,繼續(xù)查找
            j--;
        }
        //如果比基準(zhǔn)數(shù)小声邦,則將查找到的小值調(diào)換到i的位置
        array[i] = array[j];
        
        /**** 當(dāng)在右邊查找到一個比基準(zhǔn)數(shù)小的值時(shí)乏奥,就從i開始往后找比基準(zhǔn)數(shù)大的值 ***/
        while (i < j && [array[i] integerValue] <= key) {//如果比基準(zhǔn)數(shù)小,繼續(xù)查找
            i++;
        }
        //如果比基準(zhǔn)數(shù)大亥曹,則將查找到的大值調(diào)換到j(luò)的位置
        array[j] = array[i];
        
    }
    
    //將基準(zhǔn)數(shù)放到正確位置
    array[i] = @(key);
    
    /**** 遞歸排序 ***/
    //排序基準(zhǔn)數(shù)左邊的
    NSLog(@"before--left%d---%d",i,rightIndex);

    [self quickSortArray:array withLeftIndex:leftIndex andRightIndex:i - 1];
    //排序基準(zhǔn)數(shù)右邊的
    NSLog(@"afterleft---%d---%d",i,rightIndex);

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

(4)二叉樹的創(chuàng)建:

      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塊錢能買多少瓶酒骗炉?
遞歸算法解決

  /**
*  計(jì)算酒瓶數(shù)
*  @param beer 啤酒數(shù)
*  @param bottleCaps 瓶蓋數(shù)
*  @param bottle 瓶子數(shù)
*/
- (void)calculateBeerWithBeer:(int)beer bottleCaps:(int)bottleCaps bottle:(int)bottle{
   NSLog(@"第%d次的啤酒數(shù):%d,瓶蓋數(shù):%d,瓶子數(shù):%d",self.i,beer,bottleCaps,bottle);
   /** 不管什么,反正瓶蓋和瓶子等于啤酒(可能有換不完的) */
   bottle += beer;
   bottleCaps += beer;
   /** 換完瓶蓋和瓶子之后的啤酒數(shù)蛇受,瓶蓋數(shù)句葵,瓶子數(shù) */
   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.
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子乍丈,更是在濱河造成了極大的恐慌剂碴,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,835評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轻专,死亡現(xiàn)場離奇詭異忆矛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)请垛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,900評論 2 383
  • 文/潘曉璐 我一進(jìn)店門催训,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宗收,你說我怎么就攤上這事漫拭。” “怎么了镜雨?”我有些...
    開封第一講書人閱讀 156,481評論 0 345
  • 文/不壞的土叔 我叫張陵嫂侍,是天一觀的道長。 經(jīng)常有香客問我荚坞,道長挑宠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,303評論 1 282
  • 正文 為了忘掉前任颓影,我火速辦了婚禮各淀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘诡挂。我一直安慰自己碎浇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,375評論 5 384
  • 文/花漫 我一把揭開白布璃俗。 她就那樣靜靜地躺著奴璃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪城豁。 梳的紋絲不亂的頭發(fā)上苟穆,一...
    開封第一講書人閱讀 49,729評論 1 289
  • 那天,我揣著相機(jī)與錄音唱星,去河邊找鬼雳旅。 笑死,一個胖子當(dāng)著我的面吹牛间聊,可吹牛的內(nèi)容都是我干的攒盈。 我是一名探鬼主播,決...
    沈念sama閱讀 38,877評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼哎榴,長吁一口氣:“原來是場噩夢啊……” “哼型豁!你這毒婦竟也來了僵蛛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,633評論 0 266
  • 序言:老撾萬榮一對情侶失蹤偷遗,失蹤者是張志新(化名)和其女友劉穎墩瞳,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氏豌,經(jīng)...
    沈念sama閱讀 44,088評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喉酌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,443評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泵喘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泪电。...
    茶點(diǎn)故事閱讀 38,563評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖纪铺,靈堂內(nèi)的尸體忽然破棺而出相速,到底是詐尸還是另有隱情,我是刑警寧澤鲜锚,帶...
    沈念sama閱讀 34,251評論 4 328
  • 正文 年R本政府宣布突诬,位于F島的核電站,受9級特大地震影響芜繁,放射性物質(zhì)發(fā)生泄漏旺隙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,827評論 3 312
  • 文/蒙蒙 一骏令、第九天 我趴在偏房一處隱蔽的房頂上張望蔬捷。 院中可真熱鬧,春花似錦榔袋、人聲如沸周拐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,712評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽妥粟。三九已至,卻和暖如春吏够,著一層夾襖步出監(jiān)牢的瞬間罕容,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,943評論 1 264
  • 我被黑心中介騙來泰國打工稿饰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人露泊。 一個月前我還...
    沈念sama閱讀 46,240評論 2 360
  • 正文 我出身青樓喉镰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親惭笑。 傳聞我的和親對象是個殘疾皇子侣姆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,435評論 2 348

推薦閱讀更多精彩內(nèi)容