0

動的計画法を使用して二項係数を計算しようとしています。このエラーが発生し続けます

fun binomial(m:int, n:int, DP) =
if n = m orelse n = 0 then 
    Array2.update(DP, m, n, 1)
else if Array2.sub(DP, m, n) = ~1 then ( 
    if Array2.sub(DP, m-1, n) = ~1 then
        Array2.update(DP, m-1, n, binomial(m-1, n, DP))
    else 
        Array2.update(DP, m-1, n, Array2.sub(DP, m-1, n));
    if Array2.sub(DP, m-1, n-1) = ~1 then
        Array2.update(DP, m-1, n-1, binomial(m-1, n-1, DP))
    else
        Array2.update(DP, m-1, n-1, Array2.sub(DP, m-1, n-1));
    let
        val k = Array2.sub(DP, m-1, n) + Array2.sub(DP, m-1, n-1);
    in
        Array2.update(DP, m, n, k)
    end
)
else
    Array2.update(DP, m, n, Array2.sub(DP, m, n));
Array2.sub(DP, m, n)

このエラーが何を言おうとしているのか理解できません。

6.5-25.48 Error: right-hand-side of clause doesn't agree with function result type     [literal]
expression:  unit
result type:  int
in declaration:
binomial =
  (fn (<pat> : int,<pat> : int,DP) =>
        if <exp> orelse <exp>
        then Array2.update <exp>
        else if <exp> then <exp> else <exp>)

誰でも私を助けることができますか?

4

1 に答える 1

1

関数binomialは の結果を返します。Array2.updateこれはunitです。しかし、この戻り値をArray2.update最後の引数として に渡していintます。

編集:ああ、わかりました...唯一の問題は、最後の行 ( Array2.sub(DP,m,n)) が関数の一部ではないことです。式のリストを作成する場合は、括弧で囲む必要があります。だから代わりに

fun binomial (m,n,DP) = <update logic>; Array2.sub(DP,m,n)

あなたが欲しい

fun binomial (m,n,DP) = (<update logic>; Array2.sub(DP,m,n))
于 2013-10-31T08:09:43.403 に答える