Haskell 哈斯克尔GCF/LCM

Haskell 哈斯克尔GCF/LCM,haskell,Haskell,我是哈斯克尔的新朋友 有没有一种简单的方法可以在Haskell中找到or或LCM(最小公倍数) 我不确定LCF是什么,但GCF是哈斯克尔的最爱。使用欧几里德公式,你可以真正了解哈斯克尔是如何工作的。这里有一个很好的算法设置说明 这种类型的递归在Haskell中很常见,它显示了语言的表达能力 gcd a 0 = a gcd a b = gcd b (a `mod` b) 这使用参数的模式匹配来表示任何数字的最大公因数,0是第一个数字。如果两个数字都不为零,则查找第二个和第一个mod的最大公因数。

我是哈斯克尔的新朋友


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

我不确定LCF是什么,但GCF是哈斯克尔的最爱。使用欧几里德公式,你可以真正了解哈斯克尔是如何工作的。这里有一个很好的算法设置说明

这种类型的递归在Haskell中很常见,它显示了语言的表达能力

gcd a 0 = a
gcd a b = gcd b (a `mod` b)
这使用参数的模式匹配来表示任何数字的最大公因数,0是第一个数字。如果两个数字都不为零,则查找第二个和第一个mod的最大公因数。最终,在第二个参数中,该值将达到0。这将触发第一个模式并返回作为答案的第一个参数

[编辑]

该功能实际上应该是:

gcd a 0 = a
gcd a b = b `seq` gcd b (a `mod` b) where

这将强制对上一个递归步骤(a
mod
b)进行求值,并将防止在内存中生成一个巨大的thunk,例如,如果您正在GCDing 1243235452和6095689787662。Seq强制参数进入“弱头范式”或计算参数最外层的数据结构。

GCF指的是最大公因式还是最大公因式?这是可以从前奏曲中获得的
gcd
,与
lcm
一样,是最小公倍数。

gcd
导入前奏曲中。这意味着你可以随时使用它,而不必做任何事情。Erik Hinton展示了欧几里德算法的一个简单版本,如果您对实现自己的算法感兴趣的话。但是有一件事:
/
仅用于浮点除法,当您想进行“整数除法”时,使用
div
mod
查找商和余数。前奏曲还定义了一个
lcm
函数,用于最小公倍数。

或者您也可以这样做

euclid(n,m) =
  if n == m then n
  else if n < m then euclid(n, m-n)
    else euclid(n-m, m)
euclid(n,m)=
如果n==m,则n
如果n
应该在这里添加一个
seq
。绝对正确。虽然OP对Haskell来说是新事物,但现在是学习这一点的最佳时机。OP可能知道这一点,但我认为你的解释对FP或Haskell新手来说并没有太大帮助。例如:弱头范式是什么?最外层的数据结构是什么?出于什么?这样说吧,如果你不写
seq
,听起来哈斯克尔在做一件非常愚蠢的事情。为什么有一个
,其中
后面什么都没有?不需要
seq
,因为
b
已经被计算过了,以确定它是否等于0。