我正在尝试解决 SML 上的多项式评估问题,这是我拥有的当前代码:
fun eval (nil, b:real) = 0.0
| eval(x::xs, a:real) =
let val y:real = 0.0
fun inc z:real = z+1.0;
in
(x*Math.pow(a,(inc y))) + eval(xs,a)
end;
问题在于它只增加 y 一次,有没有办法让 y 从 0 开始并在每次递归时继续增加 1?
我正在尝试解决 SML 上的多项式评估问题,这是我拥有的当前代码:
fun eval (nil, b:real) = 0.0
| eval(x::xs, a:real) =
let val y:real = 0.0
fun inc z:real = z+1.0;
in
(x*Math.pow(a,(inc y))) + eval(xs,a)
end;
问题在于它只增加 y 一次,有没有办法让 y 从 0 开始并在每次递归时继续增加 1?
您可以通过使用局部函数(或辅助函数)的概念来做到这一点。这是代码:
local
fun helper(nil,b:real,_)=0.0
|helper(x::xt,b:real,y)=(x*(Math.pow(b,(y)))) + helper(xt,b:real,y+1.0)
in
fun eval(x,a:real)= helper(x,a,0.0)
end
我希望这可以解决您的问题:)
y
在函数内部的表达式中设置为 0 let
,因此每次调用该函数时,它的值为 0。如果您想为函数y
的不同调用设置不同的值,eval
那么您应该将其设为该函数的参数.
如果xs
应该是递增顺序的系数:
fun eval'( nil, a, n) = 0.0
| eval'(x::xs, a, n) = x*Math.pow(a, n) + eval'(xs, a, n + 1.0)
fun eval(xs, a) = eval'(xs, a, 0.0)
或者,因为a
在递归中实际上是恒定的:
fun eval(xs, a) =
let
fun eval'( nil, n) = 0.0
| eval'(x::xs, n) = x*Math.pow(a, n) + eval'(xs, n + 1.0)
in
eval'(xs, 0.0)
end
或者,如果您不想自己编写递归:
fun eval(xs, a) = foldl (fn(x, (s, n)) => (x*Math.pow(a, n) + s, n + 1.0)) (0.0, 0.0) xs