我开始对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的新手,任何输入都会受到赞赏。谢谢!
答案 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
来执行这种“扭曲排序”,甚至可以使用它来排序非整数列表(只要你给它一个比较函数)相应的类型)。