2012-03-12 2 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

Спасибо тонну :) это именно то, что я был oking для, чтобы те же аргументы передавались – AuthenticReplica

+0

@TarekMerachli Мое удовольствие :) – atuljangra

0

y устанавливается равным 0 в let выражения внутри вашей функции, поэтому каждый раз, когда вы звоните, что функция имеет значение 0 Если вы хотите иметь другое значение для y для разных вызовов функции 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