F#:多项式的乘法

时间:2015-10-24 20:33:32

标签: math f#

我在“使用F#进行功能编程”(4.22.3)中找到了这个练习:

  

声明中缀F#运算符以进行加法和乘法运算   所选表示中的多项式。

f(x)= a0 + a1 * x + a2 * x ^ 2 + ... + an * x ^ n

多项式被重新作为整数列表。例如,多项式f(x)= x ^ 3 + 2由列表[2; 0; 0; 1]。现在我需要一个函数,它接受两个整数列表并返回一个整数列表:

// polymul: int list -> int list -> int list
let polymul p q = 
    ???

作者给出了这个暗示和练习:

  

以下递归公式在定义时非常有用   乘法:

     

0 * Q(x)= 0

     

(a0 + a1 * x + ... + an * x ^ n)* Q(x)=       a0 * Q(x)+ x * [(a1 + a2 * x + ... + an * x ^(n-1))* Q(x)]

我无法想出这个练习的解决方案。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

我有一个解决方案。我接受了提示并将其一对一转换为F#。它神奇地工作:

// multiplicate a polynomial with a constant
// polymulconst: float -> float list -> float list
let rec polymulconst c = function
    | []      -> []
    | a::rest -> c*a::polymulconst c rest

// multiplying a polynomial by x
// polymulx: float list -> float list
let polymulx = function
    | []      -> []
    | lst     -> 0.0::lst 

// add two polynomials
// polyadd: float int -> float int -> float int
let rec polyadd ps qs =
    match (ps, qs) with
    | ([], ys)       -> ys
    | (xs, [])       -> xs
    | (x::xs, y::ys) -> (x+y)::polyadd xs ys

// polymul: float int -> float int -> float int
let rec polymul qs = function
    | []    -> []
    | p::ps -> polyadd (polymulconst p qs) 
                       (polymulx (polymul qs ps))

let ( .++. ) p q = polyadd p q
let ( .**. ) p q = polymul p q

我测试了F#REPL中的函数:

> let polyA = [1.0; -2.0; 1.0];;

val polyA : float list = [1.0; -2.0; 1.0]

> let polyB = [-4.0; 3.0; 2.0];;

val polyB : float list = [-4.0; 3.0; 2.0]

> polymul polyA polyB;;

val it : float list = [-4.0; 11.0; -8.0; -1.0; 2.0]

> polyA .**. polyB;;

val it : float list = [-4.0; 11.0; -8.0; -1.0; 2.0]

>