首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >haskell中的同时递归关系

haskell中的同时递归关系
EN

Stack Overflow用户
提问于 2017-12-29 01:57:20
回答 1查看 138关注 0票数 3

是否有可能在haskell中建立一个同时递归关系系统?我正在尝试实现

代码语言:javascript
复制
a(n)=3a(n-1)+2b(n-1)

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

输入:

代码语言:javascript
复制
 a n = 3 * a (n-1) + 2 * b (n-1)

输出:

代码语言:javascript
复制
<interactive>:103:25: error: Variable not in scope: b :: t -> a

所以,我不能在不定义b的情况下定义a,也不能在不定义b的情况下定义b。我不确定这样做是否可行?

附言:我在gchi工作

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-29 02:04:58

在Haskell中,定义的顺序并不重要。您可以在b之前定义a,或者在a之前定义b,在这两种情况下,它们都可以很好地相互引用:

代码语言:javascript
复制
a n = 3 * a (n-1) + 2 * b (n-1)
b n = a (n-1) + 2 * b (n-1)

如果您使用的是GHCi (请澄清这一点),那么是的,它不会单独接受a的定义,因为它不知道b是什么。但是,您可以将这两个定义一起提供给GHCi,方法是将它们包含在:{ ... :}中,如下所示:

代码语言:javascript
复制
*Prelude> :{                             
*Prelude| a n = 3 * a (n-1) + 2 * b (n-1)
*Prelude| b n = a (n-1) + 2 * b (n-1)    
*Prelude| :}

最后,我必须注意到,这些定义将产生无限循环:没有ab不递归调用自身的情况(即没有输入)。这意味着,一旦你给他们中的任何一个打电话,他们就会永远不停的呼叫对方。

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

代码语言:javascript
复制
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)

(我不知道我是否提供了正确的基本用例,因为我不知道您的原始问题是什么,因此不能说在您的上下文中什么是“正确的”;我提供的基本用例只是演示如何实现它的示例)

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48012154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档