F# 多函数递归#

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

我的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,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