我基本上认为我已经完成了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));;
我做错了什么?
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);;
答案 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}}。