【发布时间】:2016-01-31 18:32:16
【问题描述】:
我在拆分和合并排序方面遇到了一些错误。 (注意这是一个格式化的赋值,每个函数都需要特定的输入和输出类型)
这是我现在的代码:
(* val split : l:'a list -> 'a list * 'a list *)
let split (l:'a list -> 'a list * 'a list) =
let rec splitInner = function
| [],[] -> [],[]
| x::xs, acc ->
if xs.Length>(acc.Length) then splitInner (xs x::acc)
else xs acc
splitInner (l, acc)
error FS0001: This expression was expected to have type
'a list * 'b list
but here has type
'c list
(* val merge : 'a list * 'a list -> 'a list when 'a : comparison *)
let rec merge l =
match l with
| (xs,[])->xs
| ([],ys)->ys
| (x::xs, y::yr) ->
if x<=y then x::merge(xr,y::yr)
else y::merge(x::xr,yr)
(* val mergesort : l:'a list -> 'a list when 'a : comparison *)
let rec mergesort l =
match l with
| [] -> []
| [x] -> [x]
| xs -> let (ys,zs) = split xs then merge(mergesort ys, mergesort zs)
acc 函数不能与 split 一起使用,并且最后一行代码中的“then”不正确。
这个想法如下:给定的列表 l 被分成两个相等的(如果 l 的长度是奇数,那么“一半”中的一个比另一个长)列表 l1 和 l2。这些列表以递归方式排序,然后将结果合并回来以提供单个排序列表。用 F# 编写代码。您的算法可以使用
编辑:我相信我不允许在此作业中使用|> List.splitAt。我正在尝试实现一个辅助函数来做同样的事情。
EDIT2:谢谢 Guy Coder,您的回答非常详尽。我需要函数 split 只接收一个列表。也许我可以在里面创建一个使用基于list.Length/2 的索引的辅助函数?假设列表输入为float list,函数返回2float lists。
EDIT3:我感觉更近了:这是我的拆分函数和我收到的错误。
(* val split : l:'a list -> 'a list * 'a list *)
let split l =
let rec splitInner l counter list1 list2 =
match (l, counter) with
| (x::xs,c) ->
if c < (l.Length/2) then
let list1 = x :: list1
let counter = counter+1
splitInner xs counter list1 list2
else
let list2 = x :: list2
let counter = counter+1
splitInner xs counter list1 list2
| ([],_) -> ((reverse list1), (reverse list2))
splitInner (l 0 [] [])
split [1;2;3;4;5;6;7;8;9;10]
error FS0001: This expression was expected to have type
int -> 'a list -> 'b list -> 'c list
but here has type
'd list
【问题讨论】:
-
我认为您输入一个列表并返回两个列表的元组。缺少的是确定在哪里拆分列表的值或计数。如果它是一个计数,那么两个列表是一个有效的输出。如果拆分是在字符串中的字符等值上,则输出可能是多个列表。请举一个输入和输出列表的例子。 :)
-
对于 Edit3 你有
splitInner (1 0 [] [])你需要splitInner 1 0 [] []注意括号被删除了。您正在将一个元组传递给 curried 参数。我知道你经常使用元组;我更喜欢 curried 参数,因为它们更适合函数式编程。我确实会在有意义的时候使用元组。 -
您必须将合并排序作为一个单独的问题提出。这一个已成为拆分问题。
-
对于您的合并排序示例,请参阅:rosettacode.org 或 fssnip.net