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
我会收到消息“Stake space overflow: current size ... use +RTS -Ksize -RTS to increase ...”。但是当我删除 main 函数中的 if 时,程序可以正常工作。此外,如果我在 ghci 中给出命令Data.Vector.last d
,则计算出的值没有问题。那么为什么要打印此消息?当我将堆栈大小增加到 20M 时,程序可以毫无问题地播放。test1 是可执行文件的名称。
谢谢。