在新泽西州SML中创建不同的微积分函数

问题描述 投票:0回答:1

A)编写函数indefIntegratePoly,该函数获取代表多项式的系数列表(从最高阶到最低阶,并且存在所有项),并返回代表该多项式的不定积分的新系数列表。您必须使用foldr(如下所示)。假定代表不定积分的反导数产生的常数为0.0。

fun foldr (f, s, []) = s
 ​ | foldr (f, s, x::rest) = f(x, foldr(f, s, rest));

我只想知道从哪里开始,因为我在努力获得有意义的ant类型的功能。

sml smlnj
1个回答
0
投票
fun foldr (f, s, []) = ...
内置foldr类似于此功能,但定义为

fun foldr f s [] = ...

即,咖喱而不是元组。

在下面的响应中,我假设您使用的是foldr版本。

我只想知道从哪里开始

您可以开始使用

fun indefIntegratePoly ks = let fun f (k, acc) = ... in foldr (f, [], ks) end

其中f取一个系数,并在acc中建立一个积分系数列表。

请注意,foldr从右到左折叠,因此k的第一个值是具有最小功效的项的系数。您知道该幂的大小,因为它从1开始,并且倍数的后续迭代表示的幂大于该幂。

如果我没记错的话,

a·x ^ n与((a·x ^(n + 1))/ n积分,所以对于任何一项,都必须除以该项的功效。这意味着f的上下文必须具有可用的上下文。 acc可以是任何类型,例如int×int list,其中第一个int是当前项的幂。

展开模板,

fun indefIntegratePoly ks = let fun f (k, (n, iks)) = (n+1, ...) in #2 (foldr (f, [], (1, ks))) end

倍数累积一对,其中k是当前项的系数,n是当前项的幂,并且iks是综合系数的列表。增加每个项的幂(在

a·x ^ n中将n转换为n + 1(a·x ^(n + 1))/ n) )是向列表中添加一个额外项的问题,这可以通过用一些[j]而不是[]初始化折叠来完成,其中j是常数项k的系数为< [k→k·x ^ 1

由于foldr现在会产生一个对,并且该对的#1部分仅在迭代过程中使用,而#2部分保留了积分系数,因此可以通过使用[ C0]。
© www.soinside.com 2019 - 2024. All rights reserved.