有没有一种在F#中定义一个函数的方法,可以计算出到提供的整数参数为止的所有自然数之和,而不使用
换句话说,为什么以下代码是错误的?
match
结构。换句话说,为什么以下代码是错误的?
let Sum 0 = 0
let Sum n = n + Sum (n - 1)
match
结构。let Sum 0 = 0
let Sum n = n + Sum (n - 1)
match
,只需使用一个普通的条件语句:let rec Sum n =
if n = 0 then 0 else n + Sum (n-1)
模拟Haskell的惯用方式如下:
let rec Sum = function
| 0 -> 0
| n -> n + Sum (n-1)
但实际上你不需要递归,因为有一个闭式解法;可以看看 @bytebuster 代码中“太显然”的部分。
Sum
的双重定义。F#语法与Haskell的不同,它要求只有一个函数入口,并且在内部使用match
或一系列if
来进行分支。match
。请注意,它们还需要参数范围检查:let Sum1 x = x * (x+1) / 2 // too obvious
let Sum2 x = Seq.init id |> Seq.take (x+1) |> Seq.sum