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이 말했듯이하지 마십시오. 프로그래밍에 대한 머리/꼬리 접근법은 패턴 매칭, 좋은 컴파일러 최적화, 꼬리 호출 최적화 등과 같은 언어에서 유용합니다. 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(_:)
이 목록으로 분할 방법의 세부 사항을 멀리 추상화 머리 꼬리가있어서 sum
이라고 쓰면, head
과 tail
에 대해서만 걱정할뿐입니다.
귀하의 질문에 만족합니까? – Alexander