在Haskell中实现多项式乘法

时间:2016-09-30 06:00:04

标签: haskell

我定义了多项式算术的一些函数

为了便于调试,我创建了多项式列表:

[5,3,7] -> 5 + 3*x + 7*x^2

在这里,我得到了已经有效的函数add

add [1,9,7] [9,3] == [10,12,7]

但是我遇到了mul

的问题
mul []       _ = [0]
mul (x : xs) ys = add (map (*x) ys) (mul (0 : xs) ys)

正如我想的那样:

[4,5,6] * [1,2,3] = 4*[1,2,3] + [0,4,6]*[1,2,3]

评估mul [1] [1,2,3]需要永远,我无法找出它的错误。

1 个答案:

答案 0 :(得分:4)

mul []       _  = [0]
mul (x : xs) ys = add (map (*x) ys) (mul (0 : xs) ys)

让我们在评估mul [1] [1,2,3]时找出发生的事情:

mul (1:[]) [1,2,3]
-> add (map (*1) [1,2,3]) (mul (0:[]) [1,2,3])
-> add [1,2,3] (mul [0] [1,2,3])
-> add [1,2,3] (mul (0:[]) [1,2,3])
-> add [1,2,3] (add (map (*0) [1,2,3]) (mul (0:[]) [1,2,3]))
-> add [1,2,3] (add [0,0,0] (mul [0] [1,2,3]))

每次取出head时,都会附加另一个head0),因此,第一个列表的长度(mul的第一个参数)永远不会改变。

因此无法达到退出条件(first_list == [])。

要解决此问题,请在0之外追加mul

mul []       _  = [0]
mul (x : xs) ys = add (map (*x) ys) (0 : (mul (xs) ys))

或者这可能更接近你的直觉:

mul xs ys = if all (==0) xs
                then [0]
                else add (map (*(head xs)) ys) (0 : (mul (tail xs) ys))
相关问题