首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Haskell中使用until执行最大公约数函数

在Haskell中使用until执行最大公约数函数
EN

Stack Overflow用户
提问于 2018-06-02 05:02:59
回答 2查看 340关注 0票数 0

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

代码语言:javascript
复制
mygcd a b = until (==0) (`mod` (a b)) b

感谢您的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-02 05:20:10

我会尝试这样的东西(伪代码)

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2018-06-02 17:30:34

代码语言:javascript
复制
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成为一个元组,然后检查它的一部分。在我看来,它有点像:

代码语言:javascript
复制
until p f v = head (dropWhile (not . p) (iterate f v))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50650960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档