是否可以在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
所以,我既不能在不先定义 b 的情况下定义 a,也不能在不先定义 a 的情况下定义 b。我不确定这样做是否可行?
PS:我在gchi工作
最佳答案
在 Haskell 中,定义的顺序无关紧要。您可以在 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)
(我不知道我是否提供了正确的基本案例,因为我不知道你原来的问题是什么,所以不能说在你的上下文中什么是“正确的”;我提供的基本案例是只是示例来说明如何完成)
关于haskell - haskell中的同时递归关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48012154/