在Haskell中实现多项式乘法
我正在为多项式算术定义一些函数 为了便于调试,我列出了多项式列表:在Haskell中实现多项式乘法,haskell,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) mul [] _ = [0] mul (x : xs) ys = add
[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)
mul [] _ = [0]
mul (x : xs) ys = add (map (*x) ys) (0 : (mul (xs) ys))
我想:
[4,5,6] * [1,2,3] = 4*[1,2,3] + [0,4,6]*[1,2,3]
计算mul[1][1,2,3]需要花费很长时间,我无法找出它有什么问题
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]))
每次取出头
,另一个头
(0
)就会附加到它上面,因此,您的第一个列表的长度(mul的第一个参数)永远不会改变
因此无法达到退出条件(first\u list==[]
)
要修复它,请在mul
之外附加0
:
mul [] _ = [0]
mul (x : xs) ys = add (map (*x) ys) (mul (0 : xs) ys)
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))
让我们了解一下当您计算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]))
每次取出头
,另一个头
(0
)就会附加到它上面,因此,您的第一个列表的长度(mul的第一个参数)永远不会改变
因此无法达到退出条件(first\u list==[]
)
要修复它,请在mul
之外附加0
:
mul [] _ = [0]
mul (x : xs) ys = add (map (*x) ys) (mul (0 : xs) ys)
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))
当然,
xs==replicate(length xs)0
永远不应该实际使用all(=0)xs
是正确的方法。@leftaroundabout谢谢,这比使用coursexs==replicate(length xs)0
要简单得多all(=0)xs
是正确的方法。@leftaroundabout谢谢,宇宙所做的事情要整洁得多(1+9x)+(9+3x)==(10+12x+7x^2)
?宇宙所做的事情(1+9x)+(9+3x)==(10+12x+7x^2)