3
 import Data.Vector hiding((++))
 import System.Environment 
 d = generate 1000000 (\z->case z of
                      0 -> 2
                      1 -> 3
                      2 -> 5
                      otherwise -> if odd z then (d ! (z-1)) +2 else (d ! (z-1)) + 4)
 algorithmA _ _  1 pt  = pt
 algorithmA t k n pt = let dk = d ! k
                       q = div n dk
                       r = mod n dk
                      in if r /=0 then
                            if q>dk then
                              algorithmA t (k+1) n pt
                            else (n:pt)
                         else
                             algorithmA (t+1) k q (dk:pt)

main = do
        args<-getArgs
        let n = read (args !! 0)
        if (floor(sqrt(fromInteger n))) > Data.Vector.last d  then error ("The square  root of number is greater than " ++ show (Data.Vector.last d))
     else
         print (algorithmA 0 0 n [])

上記のプログラムをコンパイルして、たとえばコマンド ラインtest1 2222で指定すると、「ステーク スペースのオーバーフロー: 現在のサイズ ... +RTS -Ksize -RTS を使用して ... を増やしてください」というメッセージが表示されます。しかし、メイン関数の if を削除すると、プログラムは問題なく動作します。またData.Vector.last d 、ghciでコマンドを実行すると、値は問題なく計算されます。では、なぜこのメッセージが出力されるのでしょうか。スタック サイズを 20M に増やすと、プログラムは問題なく再生されます。test1 は実行可能ファイルの名前です。

ありがとう。

4

1 に答える 1