我归并排序总码匹配时IndexOutOfRangeException,看起来是这样的:F#合并排序 - 试图实现与结构
let remove array =
Array.sub array 1 (array.Length - 1)
let rec merge (chunkA : int[]) (chunkB : int[]) =
if chunkA.Length = 0 && chunkB.Length = 0 then [||]
else if chunkA.Length = 0 || chunkB.[0] < chunkA.[0] then Array.append [| chunkB.[0] |] (merge chunkA (remove chunkB))
else Array.append [| chunkA.[0] |] (merge (remove chunkA) chunkB)
let rec mergesort (array : int[]) =
let middle = array.Length/2
let chunkA = match middle with
| 1 -> [| array.[0] |]
| _ -> mergesort [| for i in 0 .. middle - 1 -> array.[i]|]
let chunkB = match array.Length - middle with
| 1 -> [| array.[array.Length - 1] |]
| _ -> mergesort [| for i in middle .. array.Length - 1 -> array.[i]|]
merge chunkA chunkB
此代码工作得很好,但我想改变系列if语句中的merge
函数为match with
语句。
然后,我尝试执行以下代码:
let rec merge (chunkA : int[]) (chunkB : int[]) =
match chunkA.Length with
| 0 when chunkA.Length = chunkB.Length -> [||]
| 0 | _ when chunkB.[0] < chunkA.[0] -> Array.append [| chunkB.[0] |] (merge chunkA (remove chunkB))
| _ -> Array.append [| chunkA.[0] |] (merge (remove chunkA) chunkB)
当我跑我的代码,Visual Studio将引发一个 “IndexOutOfRangeException” 我,特别是在这里:
| 0 when chunkA.Length = chunkB.Length -> [||]
在这种情况下,chunkA
是空的,但chunkB
有一个单一的数字。因此,我不完全确定为什么F#甚至试图返回这种情况,因为块A和B的长度不一样,但我也很困惑,为什么这会抛出索引错误,特别是在空数组上。
另外,我对F#和函数式编程一般都比较陌生。如果我的代码中的结构或方法不符合标准,那么请随时对此进行评论。
另外,如果我很厚,请随时告诉我。
非常感谢, 卢克
由于某种原因,调试器显示不正确的行。错误的真正来源是'chunkB。[0]
另外,'| 0 | _当chunkB。[0]'行将'when'条件应用于**两种情况。 “when”的工作方式通常会引起新的F#程序员的惊讶(甚至令我惊讶)(http://stackoverflow.com/questions/43455264/incomplete-pattern-match-when-two-patterns-share-a -when-clause)上周,而且我一直在使用F#)。所以这里的'0'情况下仍然会测试'when chunkB。[0]
rmunn