我对Haskell非常陌生。
有没有一种简单的方法可以在Haskell中找到GCF或LCM(最小公倍数)?
答案 0 :(得分:14)
通过GCF,你的意思是最大的共同因素,还是最大的公约数?这是gcd
,可以从前奏中获得,lcm
是最不常见的倍数。
答案 1 :(得分:7)
我不确定LCF是什么,但GCF是Haskell的最爱。使用Euclidean Algroithm,您可以真正了解Haskell的工作原理。 http://en.wikipedia.org/wiki/Euclidean_algorithm这里有一个很好的解释如何设置算法http://en.literateprograms.org/Euclidean_algorithm_(Haskell)。
这种类型的递归在Haskell中很常见,它表明了语言的表达能力。
gcd a 0 = a
gcd a b = gcd b (a `mod` b)
这使用参数上的模式匹配来表示任何数字的最大公因子,0是第一个数字。如果数字都不为零,则寻找第二个的最大公因子,第二个是第二个。最终这将在第二个参数中达到0。这将触发第一个模式并返回第一个参数,即答案。
[编辑]
该功能实际上应该是:
gcd a 0 = a
gcd a b = b `seq` gcd b (a `mod` b) where
这将强制评估前一个递归步骤(a mod
b),并且如果您是GCDing 1243235452和6095689787662,将阻止在内存中构建巨大的thunk .Seq强制参数进入其“弱头正常形式“或评估论证的最外层数据结构。
答案 2 :(得分:3)
gcd
在序言中导入。这意味着您可以随时使用它而无需任何操作。 Erik Hinton展示了欧几里德算法的简单版本,如果您有兴趣实现自己的算法。但有一件事:/
仅用于浮点除法,当你想要进行“整数除法”时,使用div
和mod
来查找商和余数。前奏还定义了lcm
函数,用于最小公倍数。
答案 3 :(得分:0)
或者你也可以
euclid(n,m) =
if n == m then n
else if n < m then euclid(n, m-n)
else euclid(n-m, m)