为什么以下Haskell代码挂起?

时间:2015-12-29 05:13:04

标签: haskell

我是Haskell的新手。我试图解决丢番图方程 | x ^ y-y ^ x |对于给定的上限 x,y<使用Haskell,是素数。 Ñ

所以,我写了这个Haskell代码:

-- list of primes
listprimesupto :: Integral a => a -> [a]
listprimesupto 1 = []
listprimesupto 2 = [2]
listprimesupto n = let halflstprimes = (listprimesupto (n `div` 2))
                   in halflstprimes++[i|i<-[((n `div` 2)+1)..n], (length [x|x<-halflstprimes, (i `mod` x) == 0])==0 ]

-- is prime?
is_prime :: Integral a => a -> Bool
is_prime 1 = False
is_prime n = let halflstprimes = (listprimesupto (n `div` 2))
             in (length [x|x<-halflstprimes, (n `mod` x) == 0])==0           

-- solve |x^y - y^x| == prime
xy_yx_p :: Integral t => t -> [(t, t)]
--xy_yx_p n = [(x,y)|x<-[2..n], y<-[2..n], x < y, (abs (x^y-y^x)) `elem` (listprimesupto (n^3))] -- version 1, works but upper limit too small
xy_yx_p n = [(x,y)|x<-[2..n], y<-[2..n], x < y, (let t=abs (x^y-y^x) in is_prime t)==True] -- version 2, hangs for n>3 ...

xy_yx_p n(版本2,未注释)挂起 n &gt; 3,在GHCi中。 Ctrl-C甚至不起作用。我必须从活动监视器中杀死ghc(我在Mac上)。

知道我在xy_yx_p做错了什么?其他两个函数似乎工作正常。

提前致谢。

1 个答案:

答案 0 :(得分:8)

那么,如果n = 4挂起,那么这个案子有什么特别之处呢?好吧,它是t。对于x = 2y = 4,您将获得

t = abs (2 ^ 4 - 4 ^ 2)
  = abs (16    - 16   )
  = abs 0
  = 0

因此,您在0中使用is_prime,因此也在listprimesupto中使用listprimesupto 0 = let halflstprimes = (listprimesupto (0 `div` 2)) in -- ..... 。这导致了永无止境的递归:

listprimesupto n | n <= 0 = []

is_prime n | n <= 1 = False

因此,请确保处理非正面输入:

numeric