如何解决OCaml 中的递归调用
我正在尝试使用以下代码在 OCaml 中实现递归调用:
| Add (x,y) ->
begin
match x,y with
| x,Bra y -> Bra (Implies(x,y))
| x,Add (a,b) -> Add(x,Add(a,b))
| x,y -> Implies(x,y)
end
用2种情况测试时,我发现在情况2中程序进入无限循环。
-
+(p,[] z)
它返回[](p => z)
-
+(p,+(q,[] z))
它应该返回[](p => (q => z))
,而不是进入永无止境的循环。
我可以看到案例 2 的问题是因为我在另一个 Add
运算符中调用 Add
。但是我在这里理解循环的“退出”应该由匹配子句的第一行给出,但是它不起作用。
如果您有任何建议,我将不胜感激。 只是为了澄清,我正在使用运算符的下一个语法
Add +,Bra [],Implies =>
解决方法
在此代码摘录中,某些值(假设为 v
)与 Add (x,y)
匹配。特别是,存在 y
匹配 Add (a,b)
的情况。这意味着 v
等于这个值:
Add (x,Add (a,b))
但是,请注意,在这种情况下,您的函数的返回值也是:
Add (x,b))
那里,v
原样返回。
如果你的代码循环直到没有更多的 Add
(我不知道,因为代码不完整,请发布一个 Minimal,Reproducible Example),那么你的代码的这个分支会产生一个修复点,这可以解释无限循环。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。