F#递归函数参数和堆栈溢出

时间:2014-02-07 13:30:42

标签: recursion f#

我对F#有点新鲜,当我使用一些递归函数时,我遇到了一些奇怪的行为。我有两个不同的版本:

版本1:
这会导致堆栈溢出,但它似乎不应该(至少对我的noob眼睛)

let rec iMake acc =
  match acc with
  | 10 -> 100
  | _ -> iMake acc+1

版本2:
这个就像我期望的那样工作。

let rec iMake acc =
  match acc with
  | 10 -> 100
  | _ -> iMake (acc+1)

唯一的区别是版本2将acc + 1表达式放入括号中。所以我的问题是,为什么第一个版本不起作用,但第二个版本不起作用?这是否意味着我应该将所有函数参数放入括号中以避免将来出现这种类型的东西?

1 个答案:

答案 0 :(得分:3)

Function call的优先级高于二元运算符+。所以第一个函数实际上就像:

let rec iMake acc =
    match acc with
    | 10 -> 100
    | _ -> (iMake acc)+1