F#递归函数没有结束,虽然我认为它应该

时间:2014-03-17 21:19:56

标签: recursion f#

我的代码中有一个递归函数,如下所示:

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。为什么会发生这种情况?

3 个答案:

答案 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(),但我已经理解了问题并解决了它。谢谢你们!