我寫了一個遞歸mergeSort
功能:嵌套函數崩潰雨燕編譯
func mergeSort<T: Comparable>(inout array: [T]) {
if array.count <= 1 {
return
}
var leftSlice = [T](array[0..<array.count/2])
var rightSlice = [T](array[array.count/2...array.endIndex - 1])
mergeSort(&leftSlice)
mergeSort(&rightSlice)
array = merge(leftSlice, rightSlice)
}
func merge<T: Comparable>(var left: [T], var right: [T]) -> [T] {
var mergedValues = [T]()
while !left.isEmpty && !right.isEmpty {
mergedValues.append(left.first! < right.first! ? left.removeAtIndex(0) : right.removeAtIndex(0))
}
if !left.isEmpty {
mergedValues += left
} else if !right.isEmpty {
mergedValues += right
}
return mergedValues
}
現在,由於merge()
只應該由mergeSort()
使用我把它的mergeSort()
內,因此使merge()
一個nested function:
func mergeSort<T: Comparable>(inout array: [T]) {
func merge<T: Comparable>(var left: [T], var right: [T]) -> [T] {
var mergedValues = [T]()
while !left.isEmpty && !right.isEmpty {
mergedValues.append(left.first! < right.first! ? left.removeAtIndex(0) : right.removeAtIndex(0))
}
if !left.isEmpty {
mergedValues += left
} else if !right.isEmpty {
mergedValues += right
}
return mergedValues
}
if array.count <= 1 {
return
}
var leftSlice = [T](array[0..<array.count/2])
var rightSlice = [T](array[array.count/2...array.endIndex - 1])
mergeSort(&leftSlice)
mergeSort(&rightSlice)
array = merge(leftSlice, rightSlice)
}
現在first版本正常工作,但second一個沒有。
這怎麼可能?
我也注意到了這一點。如果我引入嵌套泛型,則操作系統甚至不會運行,並嘗試使用嵌套泛型編譯產生分段錯誤。 – kellanburket 2015-02-23 18:29:34
是的,這是一個編譯器崩潰,而不是一個運行時錯誤(我編輯了問題標題) – 2015-02-23 18:32:37
好的,我有幾個問題: (1)你怎麼知道'removeAtIndex'需要* O(n)*時間? || (2)是否有可能在不初始化靜態數組的情況下創建靜態數組,通過在'let'定義的數組上使用'reserveCapacity'來以某種方式進行初始化? || (3)你爲什麼對Swift有太多瞭解? – 2015-02-23 21:20:02