Haskell中的GCF / LCM

时间:2011-10-27 21:53:12

标签: haskell

我对Haskell非常陌生。

有没有一种简单的方法可以在Haskell中找到GCF或LCM(最小公倍数)?

4 个答案:

答案 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展示了欧几里德算法的简单版本,如果您有兴趣实现自己的算法。但有一件事:/仅用于浮点除法,当你想要进行“整数除法”时,使用divmod来查找商和余数。前奏还定义了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)