iOS递归函数

一. 什么是递归?

简单点来说,就是一个函数直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
我们可以把” 递归 “比喻成 “查字典 “,当你查一个词,发现这个词的解释中某个词仍然不懂,于是你开始查这第二个词。
可惜,第二个词里仍然有不懂的词,于是查第三个词,这样查下去,直到有一个词的解释是你完全能看懂的,那么递归走到了尽头,然后你开始后退,逐个明白之前查过的每一个词,最终,你明白了最开始那个词的意思。(摘自知乎的一个回答)

二. 常见使用案例

  1. 操作不知道层级的数组,拆成一个数组
class ViewController: UIViewController {
    
    var resultArray: Array<Any> = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        /// 将数组拆成一维数组
        let array = [
            ["1","2"],
            ["3",["4"]],
            ["5",["6"],[["7"]]],
            ]
        print(recursiveFunc(array: array))
    }

    @discardableResult
    func recursiveFunc(array: Array<Any>) -> Array<Any> {
        
        for (_, value) in array.enumerated() {
            
            if let tempValue = value as? Array<Any> {
                recursiveFunc(array: tempValue)
            } else {
                resultArray.append(value)
            }
        }
        return resultArray
    }
}

// 输出结果
["1", "2", "3", "4", "5", "6", "7"]
  1. 对无线层数组中字典key的处理
class ViewController: UIViewController {
    
    var resultArray: Array<Any> = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        /// 取出来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))
    }

    @discardableResult
    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
    }
}

/// 输出
[0, 2, 5]
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,436评论 0 5
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,830评论 2 9
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,286评论 0 3
  • 动态规划 111. 爬楼梯思路类似斐波那契数列注意考虑第 0 阶的特殊情况 272. 爬楼梯 II思路类似上题,只...
    6默默Welsh阅读 2,451评论 0 1
  • 在曾经在微博看过一句话,“人永远不会珍惜这三种人:一是轻易得到;二是永远不会离开的;三是那个一直对你很好的人”。后...
    巨梨App阅读 567评论 0 0