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

所以,我既不能在不先定义 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| :}

最后,我必须指出,这些定义,如所写,将产生一个无限循环:没有任何情况(即没有输入)ab不要递归地调用自己。这意味着,一旦您调用它们中的任何一个,它们将永远互相调用。

要解决此问题,您需要提供一个基本案例 - 一个输入或一组输入,其中函数不会调用自身,例如:

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/

相关文章:

haskell - 我们可以抽象类型类吗?

haskell - 是否有可能在 Haskell 中用 par 加速快速排序?

scala - 是否有适用于 Haskell 或 Scala 等功能语言的 LL 解析器生成器?

haskell - 我该如何内存?

list - 无法理解 Haskell 中的原始递归定义

haskell - 索引使用 repa-devil 读取的图像

haskell - 我如何告诉 runhaskell 模块不在同一个文件夹中?

Haskell 使用元组定义多个函数

java - Java中的高级泛型

python - 部分应用列表理解