Haskell中的GCF/LCM

Dyn*_*mic 6 haskell

我是Haskell的新手.

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

Dan*_*her 15

通过GCF,你的意思是最大的共同因素,还是最大的公约数?也就是说gcd,从前奏中可以看出,这是lcm最不常见的倍数.


Eri*_*ton 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)
Run Code Online (Sandbox Code Playgroud)

这使用参数上的模式匹配来表示任何数字的最大公因数,0表示第一个数字.如果数字都不为零,则寻找第二个的最大公因子,第二个是第二个.最终这将在第二个参数中达到0.这将触发第一个模式并返回第一个参数,即答案.

[编辑]

该函数实际上应该是:

gcd a 0 = a
gcd a b = b `seq` gcd b (a `mod` b) where
Run Code Online (Sandbox Code Playgroud)

这将强制评估前一个递归步骤(a modb),并且如果您是GCDing 1243235452和6095689787662,将阻止在内存中构建巨大的thunk .Seq强制参数进入其"弱头正常形式"或评估参数的最外层数据结构.

  • Tbh 我认为你为什么添加 `seq` 的解释对于刚接触 FP 或 Haskell 的人来说并没有多大帮助。例如:什么是_弱头范式_?什么是_最外层的数据结构_?出于什么?如果你不写`seq`,这样说听起来Haskell正在做一些完全愚蠢的事情。为什么有一个没有任何内容的`where`? (2认同)