我的代码中有一个递归函数,如下所示:
let rec func (a,b)
match (a,b) with
| condition 1 -> func a+1 b
| condition 2 -> print "%s" done
| _ then func a b+1 //<-- It enters here after going into the else ()!!
if a = b then func 0 0
else ()
问题是当匹配部分结束时,它转到if语句并且不匹配它,这很好。所以它转到&#34; else()&#34;并且应该退出递归但是它会返回到|_ -> print func a b+1
。为什么会发生这种情况?
答案 0 :(得分:1)
您实际上有两段代码
匹配声明
match (a,b) with
| condition 1 -> func a+1 b
| condition 2 -> print "%s" done
| _ then func a b+1 //<-- It enters here after going into the else ()!!
然后是if / else
if a = b then func 0 0
else ()
除非&#34;条件2&#34;如果匹配,此函数将始终在匹配部分中递归,并且if / else块不会递归也无关紧要。我不确定你想要实现什么,但也许你想要匹配/什么时候
match (a,b) with
| condition 1 -> func a+1 b
| condition 2 -> print "%s" done
| _,_ when a = b -> func 0 0
| _ -> func a b+1 //<-- It enters here after going into the else ()!!
现在&#34;条件2&#34;是你的停止案例。是&#34;条件2&#34;活跃的模式?
答案 1 :(得分:0)
据推测,在达到
之后| condition 2 -> print "%s" done
然后如果a=b
你的程序继续执行
if a = b then func 0 0
(或者它可能会返回,然后在调用链的上方进行相同的调用。) 可能那个递归调用会带你去
| _ then func a b+1
由于语法轻量级,if
之后的match
始终执行。
答案 2 :(得分:0)
我遇到了问题所在。递归被称为N次,所以当递归在match语句中结束时,它必须在if语句中进行N次。我不知道为什么在调试它时会突出显示|_ -> else()
,但我已经理解了问题并解决了它。谢谢你们!