在F#中实现多项式运算

时间:2018-12-31 18:23:46

标签: f#

为我提供了多项式类型,并将其定义如下: 我想拥有一个将项添加到多项式并保持一定度数k小于或等于1的项的函数。我想我应该创建一个函数以将具有相同度数的项合并在一起并在addTermToPolynomial函数中使用,这是我所拥有的:

type poly=Poly of (float*int) list
type term = Term of float *int
exception EmptyList

let rec mergeCommonTerm(p:poly)=
    match p with
    |Poly [] -> Poly []
    |Poly (a::af)-> match mergeCommonTerm (Poly af) with 
                    |Poly recursivep -> 


let rec addTermToPoly (x:term, p:poly)=
    match x with
    |Term (coe, deg)-> match p with
                       |Poly[] ->  Poly [(coe,deg)]
                       |Poly (a::af)-> if snd a=deg then Poly ((fst a+coe,deg)::af)
                                       else match addTermToPoly (x,Poly af) with
                                         |Poly recusivep-> mergeCommonTerm(a::recusivep)

我不知道如何完成mergeCommonTerm函数,因为我不知道如何像double for循环那样遍历列表。请帮助我编写类似于term函数的合并。

1 个答案:

答案 0 :(得分:0)

<span *ngIf="item.controls.name.errors?.unique">not unique</span> term类型是用作记录的区分联合。它们很容易成为unwrapped来使用基础类型(分别为polyfloat * int)。 您可以使用辅助递归函数使事情更加容易,以度数递减的方式向元组列表添加元组。这还允许单独管理EmptyList异常。

(float * int) list

编辑:在示例中添加了一些注释

let addTermToPoly (Term (coef,deg), Poly lst) = 
    let rec loop = function
        | []           -> [(coef, deg)]
        | (c, d) :: ts ->
            if d < deg then (coef, deg) :: lst  
            elif d = deg then (coef + c, d) :: ts
            else (c, d) :: loop ts
    if (lst.IsEmpty)
    then raise EmptyList
    else Poly (loop lst) processed with loop function