是否有可能在haskell中建立一个同时递归关系的系统?我正在努力实施
a(n)=3a(n-1)+2b(n-1)
b(n) = a(n-1) + 2b(n-1)
Run Code Online (Sandbox Code Playgroud)
输入:
a n = 3 * a (n-1) + 2 * b (n-1)
Run Code Online (Sandbox Code Playgroud)
输出:
<interactive>:103:25: error: Variable not in scope: b :: t -> a
Run Code Online (Sandbox Code Playgroud)
所以,我不能先定义一个没有定义b,但也不能定义b而不定义第一个.我不确定这样做是否可行?
PS:我在gchi工作
在Haskell中,定义的顺序无关紧要.您可以a在之前b或b之前定义a,在这两种情况下,它们可以很好地引用彼此:
a n = 3 * a (n-1) + 2 * b (n-1)
b n = a (n-1) + 2 * b (n-1)
Run Code Online (Sandbox Code Playgroud)
如果你在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| :}
Run Code Online (Sandbox Code Playgroud)
最后,我必须注意这些定义,如所写的,将产生一个无限循环:没有任何情况(即没有输入),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)
Run Code Online (Sandbox Code Playgroud)
(我不知道我是否提供了正确的基础案例,因为我不知道你的原始问题是什么,所以不能说你的上下文中的"正确";我提供的基本案例只是示例说明如何做到)
| 归档时间: |
|
| 查看次数: |
102 次 |
| 最近记录: |