Array
は、ArraySlice
として、任意Sequence
からArray
を生成することができるイニシャライザ(init(_:)
)を有しています。
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が言ったように、これをしないでください。プログラミングに対するhead/tailアプローチは、パターンマッチング、良いコンパイラの最適化、テールコールの最適化などを容易にする言語で意味があります。Swiftのデザインはreduce
を使用することを奨励しています。それは短くて読みやすいだけでなく、より効果的です。
比較のために、ここでは代表的なスウィフトのアプローチはこれにどうなるかです:
extension Sequence where Iterator.Element: Integer {
func sum() -> Iterator.Element {
return self.reduce(0, +)
}
}
- それは、簡単かつ短いです。それはただの
Integer
タイプだけでなく、Int
上Array
それはジェネリックだに限定されるのではなく、任意のSequence
でうまくいくよう
- それは、多形です。したがって、これらすべての作業は:
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(_:)
リストをに分割する方法の詳細を抽象化それはあなたのために提供されるhead
とtail
について心配するだけでsum
と書くことを可能にする頭の尾です。
私はあなたの質問を満足しましたか? – Alexander