Why is this recursive function in Haskell so slow?

I am trying to imitate a sieve to find the whole number less than some number using Haskell. I found another Haskell program using the Sieve method at high speed. However, the following recursive function that I wrote is very slow. The code is as follows

sieve' :: Integer -> Integer -> [Integer]

sieve' n 1 = [2 .. n]

sieve' n (k + 1) | [x | x <- sieve' n k, x == k + 1] == [] = sieve' n k

    |otherwise = [x | x <- sieve' n k,  x == k + 1 || not (mod x (k + 1) == 0)]



sieve :: Integer -> [Integer]

sieve n = sieve' n n

Sieve 20 takes about 2 minutes. City 30 is not finished when I write this question.

Can anyone explain why this recursive function is so slow. Thanks for any help you can provide.

+5
source share
1 answer

sieve' (sieve' n k), .

, , :

sieve' n (k + 1) | [x | x <- rec, x == k + 1] == [] = rec
    |otherwise = [x | x <- rec,  x == k + 1 || not (mod x (k + 1) == 0)]
  where
    rec = sieve' n k

, :

, CSE ( ), , , .

Googling "CSE" , 1987 " " "(, , , )

+14

All Articles