我需要帮助在Haskell中编程一个函数来计算最大公约数。问题是我需要使用until函数,这是我无法实现的。我尝试使用以下代码(不起作用):
mygcd a b = until (==0) (`mod` (a b)) b
感谢您的帮助!
发布于 2018-06-02 05:20:10
我会尝试这样的东西(伪代码)
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
发布于 2018-06-02 17:30:34
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))
https://stackoverflow.com/questions/50650960
复制相似问题