0

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 を 1 回だけインクリメントすることです。y を 0 から開始し、再帰ごとに 1 ずつ増やし続ける方法はありますか?

4

3 に答える 3

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

私はこれがあなたの問題を解決できることを願っています:)

于 2012-03-12T21:50:12.553 に答える
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
于 2012-03-12T22:17:10.547 に答える
0

yは関数内の式で 0 に設定されているletため、その関数を呼び出すたびに値 0 になります。関数の呼び出しごとに異なる値がy必要evalな場合は、その関数のパラメーターにする必要があります。 .

于 2012-03-12T21:51:55.890 に答える