0

指定された数のすべての素因数のリストを返す SML 関数を作成しようとしています。これは、後で別の関数のヘルパー関数になります。

本来、bigNumber は素因数を求める必要のある数値であり、その数値より 1 少ない数値を除数として渡します。これは、数 100 の素因数を見つけるためにどのように呼び出すかの例です。getPrimeFactors 100 99;

現時点では、アルゴリズムに欠陥があるかどうかはあまり心配していませんが、何かエラーを見つけた場合は、喜んで耳を傾けます.

私の主な問題は、戻り値をリストとして再帰チェーンに渡し、それらのリストを他のリストと合流させようとすることです。

fun getPrimeFactors bigNumber divisor = 
    if divisor > 0 then 
        if (bigNumber mod divisor) = 0 then List.concat(getPrimeFactors (bigNumber div divisor) ((bigNumber div divisor) - 1), getPrimeFactors divisor (divisor - 1))
        else [getPrimeFactors bigNumber (divisor - 1)]
    else [bigNumber];

これを実行すると、このエラーが発生します。C:.....\run.x86-win32.exe: 致命的なエラー -- ../compiler/TopLevel/interact/evalloop.sml:66.19-66.27 で発生した 0 のキャッチされない例外エラー

C:\.....\commonFactors.sml:3.39-3.160 Error: operator and operand don't agree [tycon mismatch]
    operator domain: 'Z list list
    operand:         'Y * 'Y
        in expression:
            List.concat
            ((getPrimeFactors (<exp> div <exp>)) (<exp> div <exp> - 1),
             (getPrimeFactors divisor) (divisor - 1))
[Finished in 0.4s with exit code 1]

どんな助けでも大歓迎です!

4

2 に答える 2

0

誰かが興味を持っている場合に備えて、正しいアルゴリズムで修正されたコードを次に示します。Tayacan のおかげで List.concat エラーを修正できました。

fun getPrimeFactors big small = 
    if small > 1 then 
        if (big mod small) = 0 then List.concat[(getPrimeFactors (big div small) (big div small - 1)), (getPrimeFactors small (small - 1))]
        else List.concat[(getPrimeFactors big (small - 1))]
    else if big = 1 then nil
        else [big];
于 2013-06-28T14:02:33.493 に答える