我是Haskell的新手.
如何生成包含下一个整数的素因子的列表列表?
现在我只知道如何生成素数:
primes = map head $ iterate (\(x:xs) -> [y | y<-xs, y `mod` x /= 0 ]) [2..]
Run Code Online (Sandbox Code Playgroud) 这是我的代码:
def factorize(n):
sieve = [True] * (n + 1)
for x in range(2, int(len(sieve) ** 0.5) + 1):
if sieve[x]:
for i in range(x + x, len(sieve), x):
sieve[i] = False
lowerPrimes = i for i in range(2, len(sieve)) if sieve[i]] and (n % i == 0)]
return lowerPrimes
Run Code Online (Sandbox Code Playgroud)
factorize(n)返回给定值的所有素因子n.正如你所看到的,它首先制作一个Eratosthenes筛子n,然后使用列表理解来返回筛子中所有值的因子n.它为此目的工作得相对较好,但是,我希望它返回一个列表,这样如果你将其中的每个项目相乘,结果就是n.你明白了吗?
例如,factorize(99020)返回[2, 5, 4951],但我希望它返回[2, 2, 5, 4951],如2*2*5*4951 = 99020.
我知道我的方法甚至不是很接近,但你能帮助我做到这一点吗?
我想通过一个数据透视值将[a]分成([a],[a]),我有我的代码
splitList :: (Ord a) => a -> [a] -> ([a],[a])
splitList pivot list =
([x | x <- list, x <= pivot], [x | x <- list, x > pivot])
Run Code Online (Sandbox Code Playgroud)
但它迭代列表两次以生成两个列表,有没有办法只迭代一次?
我想.在Haskell中仅使用列表推导方法和/或(函数组合运算符)找到给定数字的所有素因子.我特别想避免递归解决方案.
例如,pfactors 120必须产生[2,2,2,3,5]输出.
我试过了:
pfactors n = [p | p <- [2..n], n `mod` p == 0, [d | d <- [1..p], p `mod` d == 0] == [1,p]]
Run Code Online (Sandbox Code Playgroud)
但是当我打电话时pfactors 120,结果[2,3,5]并非所有的主要因素.
我正在参加Euler Q3项目,需要得到一个数字的最大素数因子.到目前为止,我已经得到了一对函数来返回给定数字的所有因子的列表,但这似乎是一个非常糟糕的方法(部分因为我只需要最大的).
get_factors :: (Integral a) => a -> [a] -> [a]
get_factors _ [] = []
get_factors t (x:xs)
| t `mod` x == 0 = x:get_factors t xs
| otherwise = get_factors t xs
factors :: (Integral a) => a -> [a]
factors x = get_factors x [x,x-1..1]
> factors 1000
> [1000,500,250,200,125,100,50,40,25,20,10,8,5,4,2,1]
Run Code Online (Sandbox Code Playgroud)
对我来说,如果你要启动递归功能,我需要有一个"启动"功能似乎很奇怪(或者有一个函数,我必须将它传递两次相同的值,再次,对我来说似乎很愚蠢).
你能指出我应该如何做到这一点的正确方向吗?