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 は実行可能ファイルの名前です。
ありがとう。