作为添加数字列表的示例:
func add(_ nums: ArraySlice<Int>) -> Int { if nums.count == 0 { return 0 } else { return nums.first! + add(nums.dropFirst()) }}解决方法
Array
具有初始化器( init(_:)
),其可以从任何 Sequence
生成阵列,例如 ArraySlice
. func sum(_ nums: [Int]) -> Int { guard let head = nums.first else { return 0; } //base case,empty List. return head + sum(Array(nums.dropFirst()))}let input = Array(1...10)let output = sum(input)print(output)
但真的,正如matt所说,不要这样做.编程的头/尾方法在一种语言中很有意义,它可以很好地利用模式匹配,良好的编译器优化,尾调用优化等.Swift的设计鼓励使用reduce.它不仅更短,更易读,而且性能更高.
为了比较,以下是典型的Swift方法:
extension Sequence where Iterator.Element: Integer { func sum() -> Iterator.Element { return self.reduce(0,+) }}
>它更简单,更短.
>它是多态的,所以它适用于任何序列,而不仅仅局限于数组
>它在任何Integer类型上都是通用的,而不仅仅是Int.所以这些都有效:
print(Array<UInt >(1...10).sum())print(Array<UInt8 >(1...10).sum())print(Array<UInt16>(1...10).sum())print(Array<UInt32>(1...10).sum())print(Array<UInt64>(1...10).sum())print(Array< Int >(1...10).sum())print(Array< Int8 >(1...10).sum())print(Array< Int16>(1...10).sum())print(Array< Int32>(1...10).sum())print(Array< Int64>(1...10).sum())
但是,如果你坚持采用这种头/尾方法,试试这个:
extension Array { func headTail<ReturnType>(_ closure: (Element?,[Element]) -> ReturnType) -> ReturnType { return closure(self.first,Array(self.dropFirst())) }}func sum(_ nums: [Int]) -> Int { return nums.headTail { head,tail in guard let head = head else { return 0 } //base case,empty List return head + sum(tail) }}print(sum(Array(1...10)))
headTail(_ :)抽象出如何将列表拆分成它的尾部的详细信息,让你只需要担心为你提供的头部和尾部来编写总和.
总结以上是内存溢出为你收集整理的如何使用Swift的第一个/头部和休息/尾部?全部内容,希望文章能够帮你解决如何使用Swift的第一个/头部和休息/尾部?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)