Haskell 中使用模式匹配的手动 gcd 函数
Manual gcd function in Haskell using pattern matching
Haskell初学者来了!我正在解决一个练习题,我尝试使用模式匹配概念制作一个手动 gcd 函数,到目前为止我已经尝试了以下方法:
myGcdPM :: Int -> Int -> Int
myGcdPM x 0 = x
myGcdPM x y = myGcdPM y (mod x y)
代码似乎有效,但我想了解这是否是一个合适的 PM 和有效的解决方案?
如果你查一下the source of the standard implementation (if you didn't know where to find that: ask Hoogle),你会发现它和你的几乎一样:
gcd x y = gcd' (abs x) (abs y)
where gcd' a 0 = a
gcd' a b = gcd' b (a `rem` b)
嗯,兴趣的定义真的是gcd'
:
gcd' a 0 = a
gcd' a b = gcd' b (a `rem` b)
与你的唯一区别是它使用 rem
而不是 mod
(但在正输入上它们的行为相同)并且它以中缀表示法(a `rem` b
与 rem a b
).
相同
然后,gcd x y = gcd' (abs x) (abs y)
只是包装整个东西,确保输入是非负的。
Haskell初学者来了!我正在解决一个练习题,我尝试使用模式匹配概念制作一个手动 gcd 函数,到目前为止我已经尝试了以下方法:
myGcdPM :: Int -> Int -> Int
myGcdPM x 0 = x
myGcdPM x y = myGcdPM y (mod x y)
代码似乎有效,但我想了解这是否是一个合适的 PM 和有效的解决方案?
如果你查一下the source of the standard implementation (if you didn't know where to find that: ask Hoogle),你会发现它和你的几乎一样:
gcd x y = gcd' (abs x) (abs y)
where gcd' a 0 = a
gcd' a b = gcd' b (a `rem` b)
嗯,兴趣的定义真的是gcd'
:
gcd' a 0 = a
gcd' a b = gcd' b (a `rem` b)
与你的唯一区别是它使用 rem
而不是 mod
(但在正输入上它们的行为相同)并且它以中缀表示法(a `rem` b
与 rem a b
).
然后,gcd x y = gcd' (abs x) (abs y)
只是包装整个东西,确保输入是非负的。