【问题标题】:Doing greatest common divisor function with Haskell using until用 Haskell 做最大公约数函数直到
【发布时间】:2018-06-01 21:02:58
【问题描述】:

我需要帮助在 Haskell 中编写一个函数来计算最大公约数。问题是我需要使用我无法实现的 until 函数。我尝试使用以下代码(不起作用):

mygcd a b = until (==0) (`mod` (a b)) b

感谢您的帮助!

【问题讨论】:

  • 你遇到了什么问题?
  • 你的语法有误,所以你可能想看看你对函数应用之类的理解。例如(`mod` (a b)) 会将函数a 应用于值b 并将其用作mod 的第二个参数(通过句法上类似于`someFunction` 的部分应用程序)。

标签: haskell


【解决方案1】:

我会尝试这样的事情(伪代码)

mygcd a b = finalize (until endState nextState (a,b))
   where
   finalize (x,y)  = ...
   endState (x,y)  = some condition here
   nextState (x,y) = (x',y') computed in some way using mod

【讨论】:

  • 感谢您的回答!它有效,但我正在寻找更简单的东西。但是您的回答帮助我解决了另一个问题,非常感谢!
【解决方案2】:
mygcd a b = until (==0) (`mod` (a b)) b

> :t until
until :: (a -> Bool) -> (a -> a) -> a -> a

所以我们有我们的谓词(==0)、我们的函数(`mod`(a b))和起始值b。然而,我的第一个问题是:直到谓词成立,它才会终止,所以它永远不会产生除 0 之外的任何东西。这告诉我们什么?我们还看到a 必须是Integral a => a -> a 类型,因为它应用于b 以获得我们可以在b `mod` x 中使用的东西。重复这不会产生不同的结果,因此表达式要么立即产生 0,要么在一个 mod 之后产生 0,或者永远不会完成。

我认为,要从until 中获得有用的东西,您需要一个比相等检查更复杂的谓词。可能是像“13 比 100 的最小倍数是多少”这样的问题,或者您可以将 a 设为一个元组并检查其中的一部分。在我看来有点像:

until p f v = head (dropWhile (not . p) (iterate f v))

【讨论】:

  • 做到了!非常感谢您的解释和回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-07
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多