我有一个函数规范,声明它应该评估一个变量的多项式函数。函数系数以列表形式给出。它还接受变量的值作为实数。
例如:eval(2,[4,3,2,1])= 26(1 * x ^ 3 + 2 * x ^ 2 + 3 * x ^ 1 + 4 * x ^ 0,其中x = 2)
这是python中的函数,但我不确定如何将其转换为SML。我无法找到一种方法来传递迭代值,而无需更改函数的参数。它需要保持真实的真实列表 - >真实的功能。
def eval(r, L):
sum = 0
for i in range(0, len(L)):
sum = sum + L[i] * (r ** i)
return sum
答案 0 :(得分:4)
在函数式语言中表达和的通常方法是折叠。你可以通过在每次迭代中将sum乘以r来摆脱索引(以及将int提升到另一个int的幂的函数)的需要:
fun eval radix lst = let
fun f (element, sum) = sum * radix + element
in
foldr f 0 lst
end
现在可以像这样使用该功能:
- eval 10 [1,2,3];
val it = 321 : int
答案 1 :(得分:1)
您可以使用显式递归来遍历系数列表,对基数取幂,并总计总和。
fun eval r =
let fun step (power, sum) (coeff :: rest) =
step (power * r, sum + coeff * power) rest
| step (_, sum) nil = sum
in step (1, 0)
end
在结构上,这就像折叠一样,如果我们用一个替换它就会变得更清晰。
fun eval r lst =
let fun step (coeff, (power, sum)) = (power * r, sum + coeff * power)
val (_, sum) = foldl step (1, 0) lst
in sum
end
你可以改变使用Horner方案的操作顺序,正如KennyTM的评论中提到的那样:这将导致sepp2k的答案,这需要一半的乘法,但使用更多的堆栈空间。