我编写了一个Haskell程序,用于计算列表中不同功率的数量。
函数dist接受2个整数m n。该程序计算列表的长度,该列表包含所有数字a ^ b,其中2 <= a&lt; = m且2&lt; = b&lt; = n;数字a ^ b仅在列表中添加一次
示例
dist 5 5
-- 2^2,2^3,2^4,2^5,3^2,3^3 .....5^4,5^5 --
只有15个不同的值4,8,9,16,25,27,32,64,81,125,243,256,625,1024,3125所以答案是15。
我的代码是否有任何改进可以使其更快?或者可能是某人建议的其他方法?
import Data.List
dist :: Int -> Int -> Int
dist m n = length (nub (concat [x | a<-[2..m], let x = listpower a n] ))
listpower::Int->Int->[Int]
listpower a n = take (n-1) (powers a)
powers::Int->[Int]
powers a = [a^b| b<-[2..]]
答案 0 :(得分:2)
列表的Applicative
实例使这一点变得微不足道。
dist m n = length . nub $ (^) <$> [2..m] <*> [2..n]
(^) <$> [2..m]
会生成一系列函数fs = [(2^), (3^), ..., (m^)]
。然后fs <*> [2..n]
将这些函数中的每一个应用于[2..n]
中的每个值。
还有一个简单的列表理解,如
f <$> xs <*> ys == [f x y | x <- xs, y <- ys]