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