在SML中实现计数器

时间:2012-03-12 21:20:09

标签: sml smlnj polynomial-math

我正在尝试解决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?

3 个答案:

答案 0 :(得分:0)

您可以使用本地函数(或辅助函数)的概念来实现。这是代码:

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

我希望这可以解决你的问题:)

答案 1 :(得分:0)

y在函数内的let表达式中设置为0,因此每次调用该函数时,它的值都为0.如果要为{{1}设置不同的值对于y函数的不同调用,您应该将其作为该函数的参数。

答案 2 :(得分:0)

如果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