Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 欧几里德';使用till的s算法_Algorithm_Haskell - Fatal编程技术网

Algorithm 欧几里德';使用till的s算法

Algorithm 欧几里德';使用till的s算法,algorithm,haskell,Algorithm,Haskell,我是Haskell的初学者,刚开始学习褶皱之类的东西,大学一年级的时候 我现在面临的问题之一是使用until函数定义欧几里德算法 这是欧几里得的递归定义(编辑:只是为了展示欧几里得是如何工作的,我尝试在没有递归的情况下定义欧几里得。只使用until): 以下是我一直在使用的内容: gcd a b = until (==0) (mod a ) b 显然,这没有任何意义,因为它总是返回0,因为当b==0时,这是我的停止点,而不是打印a的值。虽然我一辈子都不知道如何获得a的值 感谢您的帮助。 提前感

我是Haskell的初学者,刚开始学习褶皱之类的东西,大学一年级的时候

我现在面临的问题之一是使用
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实施是对之前解释的直接翻译,即使我没有提供,询问者应该能够自己找到答案。无论如何,我希望通过我的解释和例子,他确实学会了如何自己做这件事。