递归思想求列表长度

3/31/2021 swift函数式编程

在 haskell 中,列表的长度是这么计算的:

length [] = 0
length [_] = 1
length (x:xs) = 1 + length xs

那么如何将这个思想在 swift 中表达:

extension Array {
    var recuse:(x: Element?, xs: [Element]?) {
        if let head = self.first {
            return (head, self.dropFirst().map { $0 })
        }
        return (nil, nil)
    }
}

func length<T>(list: [T]?) -> Int  {
    if let arr = list {
        let (x, xs) = arr.recuse
        if x == nil { return 0 }
        if xs == nil {return 1 }
        return 1 + length(list: xs)
    } else {
        return 0
    }
}
上次更新: 10/20/2022, 5:36:35 AM