我在“使用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)]
我无法想出这个练习的解决方案。任何人都可以帮助我吗?
答案 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]
>