Haskell 递归函数的空列表

Haskell 递归函数的空列表,haskell,tail-recursion,Haskell,Tail Recursion,我试着做一些有趣的工作,但我现在遇到了一个问题,我想继续前进,但似乎无法让我的功能工作。我试图计算给定整数的素数因子。该函数适用于较小的数字,如13195: > primeFactor 13195 [29,13,7,5] 但当我运行更大的数字,如600851475143: > primeFactor 601851475143 [] 我觉得这很奇怪。我知道haskell是一种懒惰的语言,但我认为它不应该那么懒惰 primeFactor' :: Int -> [Int] pr

我试着做一些有趣的工作,但我现在遇到了一个问题,我想继续前进,但似乎无法让我的功能工作。我试图计算给定整数的素数因子。该函数适用于较小的数字,如13195:

> primeFactor 13195
[29,13,7,5]
但当我运行更大的数字,如600851475143:

> primeFactor 601851475143
[] 
我觉得这很奇怪。我知道haskell是一种懒惰的语言,但我认为它不应该那么懒惰

primeFactor' :: Int -> [Int]
primeFactor' n = [ p | p <- primes' [] [2 .. n], n `mod` p == 0 ]
   where primes' :: [Int] -> [Int] -> [Int]
         primes' ys [] = ys
         primes' ys (x:xs) | x `notMultipleOf` ys = primes' (x:ys) xs
                           | otherwise            = primes' ys xs                                                                                         

-- helper function to primeFactor'
notMultipleOf :: Int -> [Int] -> Bool
notMultipleOf n [] = True
notMultipleOf n xs = and [n `mod` x /= 0 | x <- xs]
primeFactor'::Int->[Int]
素数因子'n=[p | p[Int]->[Int]
素数的ys[]=ys
素数ys(x:xs)| x`notMultipleOf`ys=primes'(x:ys)xs
|否则=素数的ys xs
--素数因子的辅助函数
notMultipleOf::Int->[Int]->Bool
n[]的非倍数=真

n xs=和[n`mod`x/=0 | x
Int
的notMultipleOf n xs=和[n`mod`x/=0 | x]有32位,您无法存储该数字(使用
整数)

另一方面,您可以使用
Data.Numbers.Primes
(和):


Int
有32位,不能存储该数字(使用
整数

另一方面,您可以使用
Data.Numbers.Primes
(和):


这是一个整数溢出错误。
Int
类型只能表示小于等于
2^31-1的数字

>> maxBound :: Int
2147483647
您输入的号码溢出--

另一方面,如果使用
Integer
类型,则不会出现溢出--


这是一个整数溢出错误。
Int
类型只能表示小于等于
2^31-1的数字

>> maxBound :: Int
2147483647
您输入的号码溢出--

另一方面,如果使用
Integer
类型,则不会出现溢出--


老实说,我不知道你为什么会得到一张空名单……或者别的什么

你正在使用蛮力方法来寻找素数列表,将所有数字除以所有比它小的素数。这就像n^2

这需要多长时间才能完成

N^2 ~= (601851475143)^2 ~= 10^22 operations
这比这要好一点,因为素数的密度下降了,但不会太大……让我们去掉一个10^2的因子来解释这一点。在现代8核4GHz机器上(假设每次操作1cpu周期……非常乐观),这应该需要

10^20 operations / (10^10 operation/sec) = 10^10 sec ~= 300 years
完成


你可能想寻找一种新的算法。

老实说,我不知道你为什么会得到一个空列表……或者任何东西

你正在使用蛮力方法来寻找素数列表,将所有数字除以所有比它小的素数。这就像n^2

这需要多长时间才能完成

N^2 ~= (601851475143)^2 ~= 10^22 operations
这比这要好一点,因为素数的密度下降了,但不会太大……让我们去掉一个10^2的因子来解释这一点。在现代8核4GHz机器上(假设每次操作1cpu周期……非常乐观),这应该需要

10^20 operations / (10^10 operation/sec) = 10^10 sec ~= 300 years
完成

您可能需要寻找一种新的算法