Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/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
haskell中的同时递归关系_Haskell - Fatal编程技术网

haskell中的同时递归关系

haskell中的同时递归关系,haskell,Haskell,在haskell中有可能建立一个同时递归关系系统吗?我正在努力实现 a(n)=3a(n-1)+2b(n-1) b(n) = a(n-1) + 2b(n-1) 输入: a n = 3 * a (n-1) + 2 * b (n-1) 输出: <interactive>:103:25: error: Variable not in scope: b :: t -> a :103:25:错误:变量不在范围内:b::t->a 因此,如果不先定义b,我也不能定义a,但是如果不先

在haskell中有可能建立一个同时递归关系系统吗?我正在努力实现

a(n)=3a(n-1)+2b(n-1)

b(n) = a(n-1) + 2b(n-1)
输入:

 a n = 3 * a (n-1) + 2 * b (n-1)
输出:

<interactive>:103:25: error: Variable not in scope: b :: t -> a
:103:25:错误:变量不在范围内:b::t->a
因此,如果不先定义b,我也不能定义a,但是如果不先定义a,我也不能定义b。我不确定这样做是否可行


注:我在哈斯克尔的gchi工作,定义的顺序并不重要。您可以在
b
之前定义
a
,或者在
a
之前定义
b
,在这两种情况下,它们可以很好地相互引用:

a n = 3 * a (n-1) + 2 * b (n-1)
b n = a (n-1) + 2 * b (n-1)
如果您在GHCi工作(请澄清),那么是的,它不会单独接受
a
的定义,因为它不知道
b
是什么。但是,您可以将这两个定义一起提供给GHCi,方法是将它们封装在
:{…:}
中,如下所示:

*Prelude> :{                             
*Prelude| a n = 3 * a (n-1) + 2 * b (n-1)
*Prelude| b n = a (n-1) + 2 * b (n-1)    
*Prelude| :}
最后,我必须注意,这些定义,正如所写的,将产生一个无限循环:没有任何情况(即没有输入)是
a
b
不递归调用的。这意味着,一旦你给他们中的任何一个打电话,他们就会一直互相打电话

要解决这个问题,您需要提供一个基本情况—一个输入或一组输入,其中函数不调用自己,例如:

a 0 = 1
a n = 3 * a (n-1) + 2 * b (n-1)

b 0 = 1
b n = a (n-1) + 2 * b (n-1)

(我不知道我是否提供了正确的基本情况,因为我不知道您最初的问题是什么,因此无法说明在您的上下文中什么是“正确的”;我提供的基本情况只是说明如何实现的示例)

您要找的术语是在中可能出现的。如果您使用的是GHCi,使用
:set+m
打开多行模式并同时使用
定义这两种模式可能会有所帮助。请注意,此类定义将导致指数复杂度算法。不要期望它能合理地为大的输入值工作。@chi但编译器不是自动为我们处理吗?编译器不会将低效的算法转化为高效的算法。如果你需要一个有效的算法,你需要把它提供给编译器。@chi我不知道你是否是Haskell方面的专家。但是Haskell是一种纯粹的函数式语言,这意味着在Haskell中你必须递归地定义函数,没有for循环。然而,我听说haskell编译器是智能的,它将决定如何高效地编译,并且函数之间不会按照您认为的顺序调用。