haskell中的派生函数

时间:2017-05-11 21:34:53

标签: haskell

我想要解决此代码中发生的事情。有人能告诉我它的主要思想是什么。我得到的是多项式的推导。但我不知道derN xs 1 , derN xs (n+1) and derN xs 0实际做了什么

derN :: P -> Int -> P
derN [] n = []


derPolinom :: P -> P
derPolinom xs = derN xs 0

2 个答案:

答案 0 :(得分:1)

也许通过一个例子来帮助它。看起来你有type P = [Int]的定义,所以我会假设。让我们取多项式3x 2 + 5x + 7,这将在此方案中表示为[7, 5, 3]

要计算此多项式的导数,我们从derPolynom开始:

derPolinom [7, 5, 3]
=
derN [7, 5, 3] 0

所以我们只需致电derN。我们找到第一个匹配的案例:

derN (x:xs) 0 = derN xs 1

然后x7xs[5, 3],因此我们将这些值替换为正文:

derN [5, 3] 1

我们已经到达另一个电话,所以我们找到匹配的案例:

derN (x:xs) n = [n * x] ++ derN xs (n+1)

这一次,x5xs[3]n1。再次替代:

[1 * 5] ++ derN [3] (1 + 1)
=
[5] ++ derN [3] 2

现在我们有另一个递归调用,它匹配相同的模式,绑定x = 3xs = []n = {{ 1}}:

2

最后,我们已经达到了递归的基本情况:

[5] ++ ([2 * 3] ++ derN [] (2 + 1))
[5] ++ ([6] ++ derN [] 3)

所以我们执行最后一次替换:

derN [] n = []

然后使用reduce来得到[5] ++ ([6] ++ []) 的答案,它代表多项式6x + 5,它实际上是3x 2 + 5x + 7的导数。

你会注意到我们只是在预先添加单元素列表,所以这一行:

[5, 6]

可以简化为:

derN (x:xs) n = [n * x] ++ derN xs (n+1)

使用高阶函数也可以更简单地编写整个函数,以避免必须明确地写出递归。我们可以使用derN (x:xs) n = n * x : derN xs (n+1) 删除最后一个系数,drop将列表中的每个剩余数字乘以其基于1的索引(表示指数)。

zipWith (*) [1..]

答案 1 :(得分:0)

这些是递归调用。例如,derN (x:xs) 0 = derN xs 1应该被理解为“多项式的导数,x作为自由成员,xs作为其他系数,与具有系数{的多项式的导数相同{1}},从权力1“开始。

此过程获取多项式的系数列表,并构建其导数的系数列表,递归地从最低功率到最高功率遍历。