在新泽西州SML创建不同的微积分函数
A) 编写函数在新泽西州SML创建不同的微积分函数,sml,smlnj,Sml,Smlnj,A) 编写函数indefinegratepoly,它获取代表多项式的系数列表(在所有项都存在的情况下,按从最高阶到最低阶的顺序),并返回一个新的系数列表表示该多项式的不定积分的系数。您必须使用foldr(如下所示)。假设代表不定积分的反导数产生的常数为0.0 fun foldr (f, s, []) = s | foldr (f, s, x::rest) = f(x, foldr(f, s, rest)); 我只是想知道从哪里开始,因为我正在努力获得有意义的ant类型的函数 内置的fo
indefinegratepoly
,它获取代表多项式的系数列表(在所有项都存在的情况下,按从最高阶到最低阶的顺序),并返回一个新的系数列表表示该多项式的不定积分的系数。您必须使用foldr
(如下所示)。假设代表不定积分的反导数产生的常数为0.0
fun foldr (f, s, []) = s
| foldr (f, s, x::rest) = f(x, foldr(f, s, rest));
我只是想知道从哪里开始,因为我正在努力获得有意义的ant类型的函数
内置的foldr
类似于此功能,但定义为
fun foldr f s [] = ...
也就是说,咖喱而不是元组
在下面的回答中,我将假设您的foldr
版本
我只是想知道从哪里开始
你可以从
fun indefintegratedpoly ks=
让fun f(k,acc)=。。。
在foldr(f,[],ks)中
结束
其中,f
取一个系数,并在acc
中建立一个综合系数列表
请注意,foldr
从右向左折叠,因此k
的第一个值是具有最小幂的项的系数。您知道这个幂有多大,因为它从1开始,后续的折叠迭代表示幂大于1的项
如果我没记错的话,a·x^n积分为(a·x^(n+1))/n,所以对于任何一个项,都必须除以该项的幂。这意味着f
的上下文必须具有可用的上下文acc
可以是任何类型,例如int×int列表,其中第一个int是当前术语的幂
在模板上展开
fun indefintegratedpoly ks=
让fun f(k,(n,iks))=
(n+1,…)
在#2中(foldr(f,[],(1,ks)))
结束
折叠累积一对,其中k
是当前项的系数,n
是当前项的幂,iks
是综合系数列表。增加每个项的幂(将n变成a·x^n中的n+1→ (a·x^(n+1))/n)是向列表中添加一个额外项的问题,可以通过使用一些[j]
而不是[]
初始化折叠来完成,其中j
是常数项k作为k的系数→ k·x^1
由于foldr
现在生成一对,并且该对的#1
部分仅在迭代期间使用,而#2
部分保留积分系数,因此可以通过使用#2
对该对进行分解来丢弃最大幂
fun foldr f s [] = ...