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