我想要解决此代码中发生的事情。有人能告诉我它的主要思想是什么。我得到的是多项式的推导。但我不知道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
答案 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
然后x
为7
而xs
为[5, 3]
,因此我们将这些值替换为正文:
derN [5, 3] 1
我们已经到达另一个电话,所以我们找到匹配的案例:
derN (x:xs) n = [n * x] ++ derN xs (n+1)
这一次,x
为5
,xs
为[3]
,n
为1
。再次替代:
[1 * 5] ++ derN [3] (1 + 1)
=
[5] ++ derN [3] 2
现在我们有另一个递归调用,它匹配相同的模式,绑定x
= 3
,xs
= []
和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“开始。
此过程获取多项式的系数列表,并构建其导数的系数列表,递归地从最低功率到最高功率遍历。