Algorithm 欧几里德';使用till的s算法
我是Haskell的初学者,刚开始学习褶皱之类的东西,大学一年级的时候 我现在面临的问题之一是使用Algorithm 欧几里德';使用till的s算法,algorithm,haskell,Algorithm,Haskell,我是Haskell的初学者,刚开始学习褶皱之类的东西,大学一年级的时候 我现在面临的问题之一是使用until函数定义欧几里德算法 这是欧几里得的递归定义(编辑:只是为了展示欧几里得是如何工作的,我尝试在没有递归的情况下定义欧几里得。只使用until): 以下是我一直在使用的内容: gcd a b = until (==0) (mod a ) b 显然,这没有任何意义,因为它总是返回0,因为当b==0时,这是我的停止点,而不是打印a的值。虽然我一辈子都不知道如何获得a的值 感谢您的帮助。 提前感
until
函数定义欧几里德算法
这是欧几里得的递归定义(编辑:只是为了展示欧几里得是如何工作的,我尝试在没有递归的情况下定义欧几里得。只使用until):
以下是我一直在使用的内容:
gcd a b = until (==0) (mod a ) b
显然,这没有任何意义,因为它总是返回0
,因为当b==0
时,这是我的停止点,而不是打印a的值。虽然我一辈子都不知道如何获得a
的值
感谢您的帮助。
提前感谢各位。提示:
现在
所以我们需要一个可以重复应用的函数,直到一个条件成立,但是我们有两个数字a
和b
,那么我们怎么做呢
解决方案是将两个数字合并为一个值,(a,b)
,因此可以这样考虑gcd
:
uncurriedGCD (a,b) = if b == 0 then (a,a) else uncurriedGCD (b,a `mod` b)
现在,您可以创建两个函数,next
&检查
,并将它们与一起使用,直到
在之前的帮助程序:
这意味着我们现在可以使用编写uncarrieredgcd
,直到
答复:
例如:
ghci> until check next (6,4)
(2,0)
ghci> until check next (12,18)
(6,0)
因此,我们可以定义:
gcd a b = c where (c,_) = until check next (a,b)
给予:
ghci> gcd 20 44
4
ghci> gcd 60 108
12
提示:
现在
所以我们需要一个可以重复应用的函数,直到一个条件成立,但是我们有两个数字a
和b
,那么我们怎么做呢
解决方案是将两个数字合并为一个值,(a,b)
,因此可以这样考虑gcd
:
uncurriedGCD (a,b) = if b == 0 then (a,a) else uncurriedGCD (b,a `mod` b)
现在,您可以创建两个函数,next
&检查
,并将它们与一起使用,直到
在
之前的帮助程序:
这意味着我们现在可以使用编写uncarrieredgcd
,直到
答复:
例如:
ghci> until check next (6,4)
(2,0)
ghci> until check next (12,18)
(6,0)
因此,我们可以定义:
gcd a b = c where (c,_) = until check next (a,b)
给予:
ghci> gcd 20 44
4
ghci> gcd 60 108
12
欧几里德的算法是这样说的:对于(a,b)
,计算(b,mod a b)
,直到(新的)b
等于零。这可以使用直接转换为实现,直到如下所示:
myGcd a b = until (\(x, y) -> y == 0) (\(x, y) -> (y, x `mod` y)) (a, b)
欧几里德的算法是这样说的:对于(a,b)
,计算(b,mod a b)
,直到(新的)b
等于零。这可以使用直接转换为实现,直到如下所示:
myGcd a b = until (\(x, y) -> y == 0) (\(x, y) -> (y, x `mod` y)) (a, b)
对不起,我在理解你的答案时遇到了一些困难。你是说我不能编写没有递归函数的函数?我试图定义欧几里得的用法,直到..递归是为那些不知道欧几里得如何工作的人准备的。他说,当使用直到时,你需要始终携带2个值,而不仅仅是一个值。与递归版本中发生的情况类似。对不起,我在理解你的答案时遇到了一些困难。你是说没有递归版本我无法编写函数?我试图定义欧几里得的用法,直到..递归是为那些不知道欧几里得如何工作的人准备的。他说,当使用直到时,你需要始终携带2个值,而不仅仅是一个值。与递归版本中发生的情况类似。其他一些人,包括我自己,没有给出最终答案,因为OP应该学习无法获得有效解决方案…@ErikAllik,实现是对之前解释的直接翻译,即使我没有提供,询问者应该能够自己找到答案。无论如何,我希望他确实通过我的解释和例子学会了如何自己去做。包括我在内的其他一些人没有给出最终答案,因为OP应该学会“得不到有效的解决方案”…@ErikAllik实施是对之前解释的直接翻译,即使我没有提供,询问者应该能够自己找到答案。无论如何,我希望通过我的解释和例子,他确实学会了如何自己做这件事。