以下代码试图在F#中进行递归冒泡排序,我收到错误
"This expression was expected to have type 'unit' but here has type ''a []'"
中间三行:
let swap i j (arr : 'a []) =
let tmp = arr.[i]
arr.[i] <- arr.[j]
arr.[j] <- tmp
let rec recursiveBubbleSort i j (sequence : 'a []) =
if i = sequence.Length then sequence //error
elif j = sequence.Length then recursiveBubbleSort (i+1) 0 sequence //error
elif sequence.[i] > sequence.[j] then swap i j sequence //error
recursiveBubbleSort i (j+1) sequence
这真让我感到困惑,因为我发现的所有资源都没有充分解释或暗示为什么会发生这种情况。任何帮助都会有很大的帮助。
答案 0 :(得分:5)
我认为这是你想写的:
let rec recursiveBubbleSort i j (sequence : 'a []) =
if i = sequence.Length then sequence
elif j = sequence.Length then recursiveBubbleSort (i+1) 0 sequence
else
if sequence.[i] > sequence.[j] then swap i j sequence |> ignore
recursiveBubbleSort i (j+1) sequence
因此,您编写的最后一个elif
必须是else
,在else
内,还有另一个if
检查是否执行交换。< / p>
所有if
.. then
,包括elif
,必须以else
结尾,除非它是unit
表达式(作为致电swap
)。
这就是你收到错误的原因。
最后请注意,您的比较是反转的,您将按降序对列表进行排序。