【发布时间】:2017-12-28 17:57:20
【问题描述】:
是否可以在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工作
【问题讨论】:
-
您要查找的术语是mutual recursion,它可以在haskell 中找到。如果您使用 GHCi,使用
:set +m打开多行模式并使用let同时定义两者可能会有所帮助 -
另请注意,此类定义将导致指数复杂度算法。不要期望它可以合理地处理大输入值。
-
@chi 但编译器不会自动为我们处理吗?
-
编译器不会把低效的算法变成高效的。如果你需要一个高效的算法,你需要将它提供给编译器。
-
@chi 我不知道你是否是 Haskell 方面的专家。但是 Haskell 是一种纯粹的函数式语言,这意味着在 Haskell 中你必须递归地定义函数,没有 for 循环。不过听说haskell编译器很智能,会决定如何高效编译,函数不会按照你想的顺序互相调用。
标签: haskell