Реализация счетчика в SML - PullRequest
0 голосов
/ 13 марта 2012

Я пытаюсь решить проблему полиномиальной оценки в 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 голосов
/ 13 марта 2012

y установлено в 0 в выражении let внутри вашей функции, поэтому каждый раз, когда вы вызываете эту функцию, оно имеет значение 0. Если вы хотите иметь другое значение для y для разных вызововeval, тогда вы должны сделать это параметром этой функции.

0 голосов
/ 13 марта 2012

Если 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
0 голосов
/ 13 марта 2012

Вы можете сделать это, используя концепцию локальной функции (или вспомогательных функций). Вот код:

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

Я надеюсь, что это может решить вашу проблему:)

...