haskell中的导数函数
我想知道这段代码中到底发生了什么。有人能告诉我主要的想法吗。我知道这是多项式的导数。但是我不知道dernxs1、dernxs(n+1)和dernxs0实际上做了什么haskell中的导数函数,haskell,Haskell,我想知道这段代码中到底发生了什么。有人能告诉我主要的想法吗。我知道这是多项式的导数。但是我不知道dernxs1、dernxs(n+1)和dernxs0实际上做了什么 derN :: P -> Int -> P derN [] n = [] derPolinom :: P -> P derPolinom xs = derN xs 0 这些是递归调用。例如,derN(x:xs)0=dernxs1应理解为“一个多项式的导数,其中x为自由成员,xs为其他系数,与系数xs的多项式的
derN :: P -> Int -> P
derN [] n = []
derPolinom :: P -> P
derPolinom xs = derN xs 0
这些是递归调用。例如,
derN(x:xs)0=dernxs1
应理解为“一个多项式的导数,其中x
为自由成员,xs
为其他系数,与系数xs
的多项式的导数相同,从幂1开始”
此过程获取多项式的系数列表,并构建其导数的系数列表,递归地从最低次幂遍历到最高次幂。通过一个示例,可能会有所帮助。看起来您有一个类似于
类型P=[Int]
的定义,所以我假设是这样的。让我们以多项式3x2+5x+7为例,它在这个方案中表示为[7,5,3]
要计算此多项式的导数,我们从derPolynom
开始:
derPolinom [7, 5, 3]
=
derN [7, 5, 3] 0
所以我们只需要调用derN
。我们发现第一种情况符合:
derN (x:xs) 0 = derN xs 1
derN (x:xs) n = [n * x] ++ derN xs (n+1)
然后x
是7
,xs
是[5,3]
,因此我们将这些值替换到主体中:
derN [5, 3] 1
我们接到了另一个电话,因此我们找到了匹配的案例:
derN (x:xs) 0 = derN xs 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
=2
:
[5] ++ ([2 * 3] ++ derN [] (2 + 1))
[5] ++ ([6] ++ derN [] 3)
最后我们讨论了递归的基本情况:
derN [] n = []
因此,我们执行最后一次替换:
[5] ++ ([6] ++ [])
然后求出[5,6]
,表示多项式6x+5,实际上是3x2+5x+7的导数
您会注意到,我们只预先准备了单个元素列表,所以这一行:
derN (x:xs) n = [n * x] ++ derN xs (n+1)
可以简化为:
derN (x:xs) n = n * x : derN xs (n+1)
也可以使用高阶函数更简单地编写整个函数,以避免显式地写出递归。我们可以使用drop
删除最后一个系数,并使用zipWith(*)[1..]
将列表中剩余的每个数字乘以其基于1的索引(表示指数)
derN
的第二个参数似乎是跟踪“当前”术语的程度,因此当我们沿着列表咀嚼时,我们增加了程度。