3

1 つの変数の多項式関数を評価する必要があることを示す関数仕様があります。関数の係数はリストとして与えられます。また、変数の値を実数として受け入れます。

例: eval(2, [4, 3, 2, 1]) = 26 (1*x^3 + 2*x^2 + 3*x^1 + 4*x^0、x = 2)

これはPythonの関数ですが、SMLに変換する方法がわかりません。関数のパラメーターを変更せずに反復値を渡す方法を見つけるのに苦労しています。実数 * 実数リスト -> 実数関数のままである必要があります。

def eval(r, L):
    sum = 0
    for i in range(0, len(L)):
        sum = sum + L[i] * (r ** i)
    return sum
4

2 に答える 2

4

関数型言語で和を表現する通常の方法は折り畳みです。各反復で合計に r を掛けることで、インデックス (および int を別の int 乗する関数) の必要性を取り除くことができます。

fun eval radix lst = let
  fun f (element, sum) = sum * radix + element
in
  foldr f 0 lst
end

これで、関数は次のように使用できます。

- eval 10 [1,2,3];
val it = 321 : int
于 2010-02-22T18:54:28.433 に答える
1

明示的な再帰を使用して、係数のリストをウォークスルーし、基数を指数化し、合計を合計できます。

fun eval r =
    let fun step (power, sum) (coeff :: rest) =
                step (power * r, sum + coeff * power) rest
          | step (_, sum) nil = sum
    in step (1, 0)
    end

構造的には、これは折り目とまったく同じであり、1つに置き換えるとより明確になります。

fun eval r lst =
    let fun step (coeff, (power, sum)) = (power * r, sum + coeff * power)
        val (_, sum) = foldl step (1, 0) lst
    in sum
    end

KennyTMのコメントで述べられているように、操作の順序を逆にしてホーナー法を使用できます。これにより、sepp2kの答えが得られます。これは、半分の乗算を必要としますが、より多くのスタックスペースを使用します。

于 2010-02-22T19:22:30.387 に答える