【发布时间】:2014-12-24 03:44:08
【问题描述】:
我对 F# 交互式输出和控制台输出之间的区别感到困惑。
问题概述:
给定一个长度为 n 的数组 A 按以下顺序对索引进行排序:
index[i] < index[j] if (A[i] < A[j]) or (A[i] = A[j] and i < j)
例如
[| 4; 2; 4; 2; 1; 1 |]
这里的索引会这样排序
[| 4; 5; 1; 3; 0; 2 |]
let GetSorted (A:int[]) =
let Comparer i j =
match (A.[i], A.[j]) with
| a1, a2 when a1 > a2 -> +1
| a1, a2 when a1 < a2 -> -1
| _, _ when i > j -> +1
| _, _ -> -1
let lenA = A |> Array.length
[| 0 .. lenA - 1 |] |> Array.sortWith Comparer
let A = [| 0; 0; 0; 0; 0; 0; 0; 0; 42; 0; 0; 0; 0; 0; 0; 0; 41 |]
let sortedPositions = GetSorted A
当我在 F# 交互中运行上面的脚本时,我得到了以下信息:
val sortedPositions : int [] =
[|0; 1; 2; 3; 4; 5; 6; 7; 9; 10; 11; 12; 13; 14; 15; 16; 8|]
注意,最后两个索引是 16 和 8。这是正确的,因为 41
当我尝试通过控制台运行时:
sortedPositions |> Array.iter(Console.WriteLine)
[|0; 1; 2; 3; 4; 5; 6; 7; 9; 10; 11; 12; 13; 14; 15; 8; 16|]
我没有找到另一个数组长度,所以两次运行会给出不同的结果,到目前为止只发现了 17 个。
为什么会这样?我怀疑排序在 F# Interactive 中的工作方式不同,因为当您靠近我的比较器时,它不能正确处理相同索引的情况(尽管我不知道为什么排序算法需要检查相同的索引)。 所以,当我为
添加另一个匹配时| _, _ when i = j -> 0
它开始工作了。但是,仍然感到困惑,没有它我会得到不同的结果。
【问题讨论】:
-
我猜,这两种方法之一的早期定义存在冲突
标签: arrays sorting f# f#-interactive