【发布时间】:2011-11-04 23:19:45
【问题描述】:
在大学我的任务如下:
定义如下函数:
primepowers :: Integer -> [Integer]计算给定参数 n 的素数的前 n 次幂的无限列表,按 asc 排序。 那是, primepowers n 包含按升序排列的元素
{p^i | p 是素数,1≤i≤n}。
完成这项任务后,我走到了死胡同。我有以下四个功能:
merge :: Ord t => [t] -> [t] -> [t]
merge [] b = b
merge a [] = a
merge (a:ax) (b:bx)
| a <= b = a : merge ax (b:bx)
| otherwise = b : merge (a:ax) bx
primes :: [Integer]
primes = sieve [2..]
where sieve [] = []
sieve (p:xs) = p : sieve (filter (not . multipleOf p) xs)
where multipleOf p x = x `mod` p == 0
powers :: Integer -> Integer -> [Integer]
powers n num = map (\a -> num ^ a) [1..n]
primepowers :: Integer -> [Integer]
primepowers n = foldr merge [] (map (powers n) primes)
我认为它们是独立工作的,因为我已经使用一些示例输入进行了测试。 merge 将两个有序列表合并为一个有序列表 primes 返回无限的素数列表 powers 计算 num 的 n 次幂(即 num^1 , num^2 ... num^n)
我尝试合并所有的primepowers,但函数没有被评估什么都没有发生,分别有某种无限循环。
我对素数或幂的优化不感兴趣。只是我不明白为什么这不起作用。还是我的方法不好,不实用,不是haskell?
【问题讨论】:
-
问题陈述自相矛盾。 “前 n 个素数的无限次幂列表”和“{p^i | p是素数,1≤i≤n}”完全不同。
-
是的。我纠正了它。这是一个翻译错误
标签: haskell recursion infinity