Ocaml-精选中的Smalltofront

时间:2018-08-08 09:45:16

标签: algorithm ocaml

我基本上认为我已经完成了swap和selectionsort函数的所有正确操作,但是我的 smalltofront 函数是不正确的。

问题是我不知道应该怎么做(请参见下面的整个代码):

 else (if a.(k) < a.(s)
    then smalltofront (a,s,i+1,j,k)
    else smalltofront (a,s,i+1,j,k));;
  • a =数组
  • s =未排序子数组的开始
  • i =从左到右的移动索引
  • j =最右边的索引
  • k =是最小条目的当前索引

我做错了什么?

let swap (a,i,j) =
let temp = a.(i)
in (a.(i)<-a.(j);
a.(j)<-temp);;



let rec smalltofront (a,s,i,j,k) =
if i>j
then swap (a,s,k)
else (if a.(k) < a.(s)
then smalltofront (a,s,i+1,j,k)
else smalltofront (a,s,i+1,j,k));;


let rec selectionsort (a,i,j) = 
if i>j
then ()
else smalltofront (a,i,i,j,i); selectionsort (a,i+1,j);;

1 个答案:

答案 0 :(得分:0)

问题在于您不会通过递归调用k来更改smalltofront。找到新的最小元素后,它应成为新的k。因此正确的解决方案将是:

let rec smalltofront (a, s, i, j, k) =
    if i > j then swap (a, s, k)
    else (
        if a.(k) < a.(i) then
            smalltofront (a, s, i+1, j, k)
        else smalltofront (a, s, i+1, j, i)
    )

还要注意,您忘记了else的{​​{1}}分支中的括号:

selectionsort

也不要忘记您的实现要求使用let rec selectionsort (a, i, j) = if i > j then () else (smalltofront (a, i, i, j, i); selectionsort (a, i + 1, j)) 作为最后一个参数来调用selectionsort

现在,我现在不介绍为什么要尝试编写此函数,但是我想您对OCaml还是很陌生,也许这是某种培训。如果我是对的,那么我想说的是,一般来说,使用数组并不是学习OCaml和函数式编程的最好方法,因此一开始就要避免使用可变类型。还要注意,当您编写类似以下内容的内容时:Array.length a - 1实际上使用一个作为元组的参数smalltofront (a, s, i, j, k)定义了函数,即使它起作用,也许意味着不同的意思,您可以简单地编写{ {1}}。