2012-03-12 62 views
0

我试图来解决SML多项式评估问题的一个柜台,这里是当前代码我有:实现在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从0开始,每次递归都增加1?

回答

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 

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

+0

谢谢吨:)这正是我是我为了保持通过相同的参数 – AuthenticReplica 2012-03-12 22:06:32

+0

@TarekMerachli My Pleasure :) – atuljangra 2012-03-12 22:11:07

0

y被设置在函数内部let表达为0,所以每次调用该函数它的值为0 。如果你想为设置不同的值,以便调用eval函数,那么你应该使它成为该函数的一个参数。

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