选择使用Twist以SML排序

时间:2012-02-24 00:00:09

标签: functional-programming sml smlnj

我开始对sml越来越熟悉,但是这个问题让我陷入了困境。我需要做的是在列表上执行选择排序,但扭曲是所有偶数需要进行奇数。

例如:

selSort[1, 6, 9, 3, 8, 4, 7, 2, 5, 3];
val it = [2, 4, 6, 8, 1, 3, 5, 7, 9] : int list

如果没有某种for-loop或变量来帮助我,我无法理解这一点。由于我是sml的新手,任何输入都会受到赞赏。谢谢!

1 个答案:

答案 0 :(得分:3)

函数式语言中的数据结构通常是不可变的;也就是说,一旦创建它们就无法修改。因此,您无法像在基于迭代阵列的实现中那样执行就地交换。相反,您需要编写一个函数,将原始列表作为参数,并返回其所需更改的独立副本。

例如,查看内置函数rev。它返回你传递的任何列表的反转版本,但它(实际上不能)不会改变原始列表的结构。

在这种情况下,您可能希望函数min(xs)x中找到最小元素xs,并且函数remove(x,xs)返回{{1}的副本删除了xs(让我们称之为x)。然后只是递归地对remainder进行排序,并将remainder添加到结果中。

您可以通过定义自己的比较函数x来强制执行此异常排序,而不是使用<来比较min中的元素,而lessThan始终为{ {1}}是偶数,lessThan(x,y)是奇数。

x

现在只需使用y替换fun lessThan(x,y) = (x mod 2 = 0 and y mod 2 = 1) or (x mod 2 = y mod 2 and x < y) 函数中x < y的任何实例。

更好的是,编写一个版本min(xs),它将比较函数lessThan(x,y)作为参数。然后你可以传递它selSort(list,comp)来执行标准排序comp来执行这种“扭曲排序”,甚至可以使用它来排序非整数列表(只要你给它一个比较函数)相应的类型)。