【问题标题】:F# Recursive function not ending although I think it shouldF#递归函数没有结束,虽然我认为它应该
【发布时间】:2014-03-18 23:07:27
【问题描述】:

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

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 语句并且不匹配它,这很好。所以它转到“else ()”并应该退出递归,但它会返回到|_ -&gt; print func a b+1。为什么会发生这种情况?

【问题讨论】:

  • 您期望什么行为?你能提供一个最小的工作示例吗?
  • 我被你的代码弄糊涂了。由于很多原因,这不应该编译。第一行没有等号。它需要一个元组,但是您在递归中传递了两个参数。您的匹配需要一个元组,但条件中没有逗号,最后一个匹配没有-&gt; 符号。

标签: recursion f#


【解决方案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 ()

除非“条件 2”匹配,否则此函数将始终在匹配部分递归,并且 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 ()!!

现在“条件 2”是您的停止案例。 “条件 2”是一种主动模式吗?

【讨论】:

    【解决方案2】:

    大概是到达后

    | condition 2 -> print "%s" done
    

    那么如果a=b你的程序继续做

    if a = b then func 0 0
    

    (或者它可能返回,然后在调用链更高的位置执行相同的调用。) 很可能该递归调用会将您带到

     | _ then func a b+1  
    

    由于轻量级语法,match 之后的if 总是被执行。

    【讨论】:

    • 那么当它进入 else() 时,我该怎么做才能让它结束呢?
    • 取决于你想要完成什么。你能把程序具体化吗?放入真实条件,让我们知道它应该做什么?
    【解决方案3】:

    我找到了问题所在。递归被调用了 N 次,所以当递归在 match 语句中结束时,它必须进入 if 语句 N 次。我不知道为什么在调试时它会突出显示|_ -&gt; else(),但我已经理解了这个问题并解决了它。谢谢各位!

    【讨论】:

      猜你喜欢
      • 2019-03-15
      • 1970-01-01
      • 2013-01-14
      • 2021-11-23
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多