F# 多函数递归#
我的hometask需要一些帮助:通过其他函数(最小、删除、插入)表达一个函数(排序)。如果你知道怎么做,请告诉我,我怎样才能运行我的递归循环?它现在只做了一步。可能是这样的:val4->head::tail |>在第25行对tail进行排序(val4)F# 多函数递归#,f#,F#,我的hometask需要一些帮助:通过其他函数(最小、删除、插入)表达一个函数(排序)。如果你知道怎么做,请告诉我,我怎样才能运行我的递归循环?它现在只做了一步。可能是这样的:val4->head::tail |>在第25行对tail进行排序(val4) 让rec最小=函数 |x::y::尾巴当x最小时(x::尾巴) |x::y::尾巴当x>y->最小时(y::尾巴) |[x]->一些x |无 让rec删除(n,xs)= 将(n,xs)与 |(n,x::xs)当nx->x::delete(n,x
让rec最小=函数
|x::y::尾巴当x最小时(x::尾巴)
|x::y::尾巴当x>y->最小时(y::尾巴)
|[x]->一些x
|无
让rec删除(n,xs)=
将(n,xs)与
|(n,x::xs)当nx->x::delete(n,xs)时
|(n,x::xs)当n=x->xs时
|(n)-->[]
让rec插入(xs,n)=
将(xs,n)与
|([x],n)当x[x]@[n]
|(x::xs,n)当xx::insert(xs,n)时
|(x::xs,n)当x>=n->n::x::xs时
| (_, _) -> []
让rec sort=函数
|xs->let val1=最小的xs
设val2=val1[0]
设val3=delete(val2,xs)
设val4=插入(val3,val2)
瓦尔4
设res=sort[5;4;3;2;1;1]
printfn“%A”res
这有点像插入排序,但由于您总是在整个列表中找到最小的数字,而不是下一个最大的数字,因此它将永远递归,除非您跳过已发现的最小数字
此外,insert和delete函数不作用于项索引,而是作用于与值相等的值,因此无法处理重复的数字
保持大多数原始代码不变,通常有一个内部递归函数来帮助跟踪状态。这是一种常见的FP模式
let sort lst =
let size = lst |> List.length
let rec sort' xs = function
| index when index = size -> xs
| index ->
let val1 = smallest (xs |> List.skip index)
let val2 = val1.[0]
let val3 = delete (val2, xs)
let val4 = insert (val3, val2)
sort' val4 (index + 1)
sort' lst 0
let res = sort [5; 3; 2; 4; 1; ]
printfn "%A" res
不用说,这是不正确的或性能不好的,每次迭代都会多次遍历列表。它可能以立方时间运行。
但要继续学习 我找到了。。。我只在上面的“最小”部分更改了4&5行:|[x]->一些x ||[x]->[x]时,无 |->[]
let rec sort = function
| xs -> match xs with
| head :: tail -> let val1 = smallest xs
match val1 with
| Some x -> let val2 = delete (x, xs)
let val3 = insert (val2, x)
let val4 = (fun list -> match list with head :: tail -> head :: sort tail | _ -> [])
val4 val3
| None -> []
| _ -> []
// let res = sort [5; 4; 3; 2; 1]
// printfn "%A" res
let rec sort = function
| xs -> match xs with
| head :: tail -> let val1 = smallest xs
match val1 with
| Some x -> let val2 = delete (x, xs)
let val3 = insert (val2, x)
let val4 = (fun list -> match list with head :: tail -> head :: sort tail | _ -> [])
val4 val3
| None -> []
| _ -> []
// let res = sort [5; 4; 3; 2; 1]
// printfn "%A" res